NPE在createPrimaryKey上。如何正确映射这两个实体?

时间:2017-08-09 01:18:25

标签: jpa

我有两个实体CredentialAccount。每个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)

还有更多行,但其中没有一行有CredentialAccount。在我的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的规定设置该属性。鉴于这种情况,以下是我的问题:

  1. 是什么导致NPE?

  2. 我错过了很好的编码实践吗?如果是的话,他们是哪一个?

  3. 根据问题的实体逻辑开始,映射这些实体的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我发现我错误地使用了PrimaryKeyJoinColumn here,这个符号来自JPA1.0。现在使用JPA2.0,我可以使用@Id + @JoinColumn  如前一个链接和this one所述。  我的问题已经解决,现在两个表都使用email中的Credential字段作为PK。