【发布时间】:2015-09-24 10:50:22
【问题描述】:
我有一个双向的一对一关系,我希望其中一个实体的 ID 也是另一个实体的 ID。
我的代码是这样的:
@Entity
public class UserProfile extends AbstractEntity{
@OneToOne(mappedBy="user",cascade = CascadeType.ALL)
private UserPreferences preferences;
//...
}
另一个实体:
@Entity
public class UserPreferences implements Serializable{
@Id
@Column(name="USER_ID")
private String userId; // I want USER_ID act as both primary key and foreign key
@OneToOne
@PrimaryKeyJoinColumn(name="USER_ID")
UserProfile user;
// ...
}
但是当我像这样持久化 UserProfile 时:
UserPreferences pref = new UserPereferences();
pref.setUser(user);
user.setPreferences(pref);
em.persist(user);
它给了我一个错误,说 UserPreferences' Id 不能为空 似乎 jpa 不明白它应该使用 UserProfile Id 作为 UserPreferences Id。
错误:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'USER_ID' cannot be null
Error Code: 1048
Call: INSERT INTO USERPREFERENCES (USER_ID) VALUES (?)
我的代码有问题吗? jpa可以解决这个问题吗?还是我应该单独保留它们?
提前致谢
【问题讨论】:
-
你在使用休眠吗?你是用它生成 DDL 吗?
-
我正在使用 eclipselink,是的,我正在生成 ddl,我删除了 userId 并向用户添加了 Id 注释并且它起作用了(正如隐藏建议的那样)我没有像欧文所说的那样尝试 MapsId,但是我相信这也有效
标签: java jpa primary-key cascade one-to-one