2013-04-20 142 views
1

我是相当新的Hibernate和事实证明,它不是一个简单的技术学习...在我使用休眠版本4.2.0.CR1项目。我试图为所有数据库实体创建一个基类,因为它们都应该包含一些标识符和创建日期。奇怪的是,起初,我在没有任何基类的情况下创建了类User和UserPicture,它工作得很好,现在我添加了它,尽管它应该像以前一样工作,但它不会o_O并继续投掷关于我的照片列表中的一些奇怪的例外,这是以前没有抛出...... 所以我一直在得到以下堆栈跟踪:无法确定类型:java.util.List的

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) 

AbstractEntity:

@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; 
} 
} 

UserPicture:

@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; 
} 
} 

那我做错了吗?为什么我要继续获得例外?

+0

这可能帮助:HTTP:/ /stackoverflow.com/questions/3774198/how-to-make-this-tutorial-work-could-not-determine-type-for-java-util-list-at – NINCOMPOOP 2013-04-20 07:42:53

+0

“为什么我不断获取例外呢?”导致您一次又一次地继续运行错误的代码。 – Vitaly 2013-04-20 07:54:34

回答

5

AbstractEntity不得与@Entity@Inheritance进行注释。它必须注明@MappedSuperclass。事实上,这种继承只是用来继承公共属性,这就是MappedSuperclass的用途。

你唯一的例外是在映射批注的位置,缺乏连贯性造成的。基类超类注释了获取者,而子类注释了这些字段。 Hibernate使用Id注释的位置来确定实体的访问类型。由于@Id位于getter上,它只考虑放置在getter上的注释,并忽略放置在字段上的注释。把所有的注释放在字段上(我会推荐)或者放在getter上。

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

+0

现在我得到了:实体映射中的重复列:UserPicture列:id(应该用insert =“false”update =“false”映射) – 2013-04-20 07:53:08

+0

你做了什么改变?您是否已将所有映射注释移至字段? – 2013-04-20 07:54:39

+0

提到的所有内容+我从UserPicture.owner中删除了@Column – 2013-04-20 07:55:59

0

Hibernate 5.2 documentation

默认情况下,@Id注释的位置给出了默认的 访问策略。

对于你的情况,Hibernate将使用AccessType.PROPERTY既为UserPictureUser实体因此例外,要使用字段映射策略,你应该定义@Access战略明确:

@Entity 
@Table(name="User") 
@Access(AccessType.FIELD) 
public class User extends AbstractEntity { 
    ... 
} 

@Entity 
@Access(AccessType.FIELD) 
public class UserPicture extends AbstractEntity { 
    .... 
} 
相关问题