我有两个实体Credential
和Account
。每个Account
必须具有唯一的Credential
,并且每个Credential
必须具有唯一的电子邮件地址和唯一的用户名。我打算稍后向Account
添加更多属性,因此我将一些属性隔离到Credential
实体:
@Entity
public class Credential {
@Id
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false, unique = true)
private String nickname;
@Column(nullable = false)
private String password;
我的Account
属性:
@Entity
public class Account {
@Id
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn(name = "email", referencedColumnName = "email")
private Credential credential;
@Column(nullable = false)
private long level;
@Column(nullable = false)
private boolean loggedIn;
我看到this answer并决定使用PrimaryKeyJoinColumn
表示法。当我尝试实例化EntityManagerFactory
时,我得到了这个堆栈错误:
Caused by: java.lang.NullPointerException
at org.hibernate.mapping.PersistentClass.createPrimaryKey(PersistentClass.java:363)
还有更多行,但其中没有一行有Credential
或Account
。在我的persistence.xml
上,我与标准文件存在以下主要区别:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>entity.PersistentEntity.Credential</class>
<class>entity.PersistentEntity.Account</class>
<properties>
<property name="tomee.jpa.factory.lazy" value="true"/>
//unchanged stuff before it stopped working
我使用Intellij和TomEE 8.5.6和JPA 2.0,我必须按照here的规定设置该属性。鉴于这种情况,以下是我的问题:
是什么导致NPE?
我错过了很好的编码实践吗?如果是的话,他们是哪一个?
根据问题的实体逻辑开始,映射这些实体的最佳方法是什么?