【问题标题】:NPE on createPrimaryKey. How to correctly map these two entities?createPrimaryKey 上的 NPE。如何正确映射这两个实体?
【发布时间】:2018-01-16 17:26:11
【问题描述】:

我有两个实体,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. 鉴于我在问题开始时的实体逻辑,映射此实体的最佳方式是什么?

【问题讨论】:

    标签: jpa


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多