java - 无法确定 : java. util.List 的类型

标签 java hibernate

我是 Hibernate 的新手,事实证明这不是一项简单的技术学习......在项目中我使用 hibernate 版本 4.2.0.CR1。我正在尝试为所有数据库实体创建一个基类,因为它们都应该包含一些标识符和创建日期。奇怪的是,起初,我在没有任何基类的情况下创建了 User 和 UserPicture 类,它工作得很好,现在我添加了它,即使它应该像以前一样工作,但它没有 o_O 并且它一直在抛出关于我的图片列表的一些奇怪的异常,之前没有抛出...... 所以我继续跟踪堆栈跟踪:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: User, for columns: [org.hibernate.mapping.Column(profilePicture)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292)
at org.hibernate.mapping.Property.isValid(Property.java:239)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)
at org.hibernate.mapping.UnionSubclass.validate(UnionSubclass.java:61)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1283)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1734)
at love.commons.database.DBManager.<init>(DBManager.java:28)
at love.commons.database.DBManagerTest.<clinit>(DBManagerTest.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

抽象实体:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEntity implements Serializable{

private static final long serialVersionUID = 1L;

protected Long id;

protected Date creationDate = new Date();

@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.TABLE)
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@Column
@NotNull
@Temporal(TemporalType.DATE)
public Date getCreationDate() {
    return creationDate;
}

public void setCreationDate(Date creationDate) {
    this.creationDate = creationDate;
}
}

用户:

@Entity
@Table(name="User")
public class User extends AbstractEntity {

private static final long serialVersionUID = 1L;

@Column (unique=true, length=30)
@NotNull
private String login;

@Column (length=32)
@NotNull
private String password;

@NotNull
@Email
@Column (unique=true, length=80)
private String email;

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="owner")
private List<UserPicture> profilePictures = new LinkedList<UserPicture>();

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@Transient
public void encryptPassword() {
    this.password = md5(password);
}

public List<UserPicture> getProfilePicture() {
    return Collections.unmodifiableList(profilePictures);
}

public void addProfilePicture(UserPicture profilePicture) {
    profilePicture.setOwner(this);
    profilePictures.add(profilePicture);
}

@Transient
private String md5(String input) {

    String md5 = null;

    if(null == input) return null;

    try {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(input.getBytes(), 0, input.length());
        md5 = new BigInteger(1, digest.digest()).toString(16);

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();
    }
    return md5;
}   
}

用户图片:

@Entity
public class UserPicture extends AbstractEntity {

private static final long serialVersionUID = 1L;

@Column(length=734004)
private byte [] picture = null;

@ManyToOne(fetch=FetchType.LAZY)
@Column(name="owner")
@JoinColumn(nullable=false,name="id")
private User owner;

public UserPicture() {
    picture = null;
}

public UserPicture(InputStream stream) {
    try {
        this.picture = new byte[stream.available()];
        stream.read(picture);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public UserPicture(byte [] picture) {
    this.picture = picture;
}

public byte[] getPicture() {
    return picture;
}

public void setPicture(byte[] picture) {
    this.picture = picture;
}

public User getOwner() {
    return owner;
}

public void setOwner(User owner) {
    this.owner = owner;
}   
}

那我做错了什么?为什么我一直收到异常?

最佳答案

AbstractEntity 不得使用 @Entity@Inheritance 进行注释。它必须用 @MappedSuperclass 注释。事实上,这种继承只是用于继承公共(public)属性,而这正是 MappedSuperclass 的作用。

您得到的异常是由于映射注释的位置缺乏连贯性造成的。基父类(super class)注释 getter,子类注释字段。 Hibernate 使用 Id 注释的位置来确定实体的访问类型。由于 @Id 在 getter 上,它只考虑放在 getter 上的注释,而忽略放在字段上的注释。将所有注释放在字段(我会推荐)或 getter 上。

此外,您的 getter 命名错误。它应该是 getProfilePictures() 而不是 getProfilePicture()

关于java - 无法确定 : java. util.List 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117923/

相关文章:

java - ITestResult 不从 XML 套件返回参数

java - Thread Run() 后实例变量为空 - Java 扑克骰子程序

java - 我想为 jOOQ 生成的类添加注释

java - Hibernate,不支持嵌套事务

hibernate - Hibernate 中的时间戳

java - Hibernate 在读取之前永久清除所有现有数据

java - ArrayList .get 比 HashMap .get 快吗?

java - 如何指定我想要的 UTF-8 版本(在 Java 中)?

mysql - Hibernate 使用 ManyToOne 注释保存新条目

spring - JPA 中的 Java 8 日期时间 API