【发布时间】:2018-01-16 17:26:11
【问题描述】:
我有两个实体,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 的原因是什么?
显然我缺少一些好的编码实践?如果有,它们是哪些?
鉴于我在问题开始时的实体逻辑,映射此实体的最佳方式是什么?
【问题讨论】:
标签: jpa