java如何在Hibernate中级联更新到子实体
我有三个实体:凭证、用户和管理员。用户和管理员实体都有一个字段credentials,该字段与使用OneToOne注释的credentials实体相关
通过entityManager更新现有用户或管理员条目时。合并,我在凭据上获得重复的密钥。具有唯一约束的登录列
@Entity
@Table
public class Credentials {
@Id
@Column(name="id", unique=true, nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique=true, nullable=false, length=50)
private String login;
@Column(nullable=false, length=50)
private String password;
/*********************************************
* getters and setters here
**********************************************/
}
@Entity
@Table
public class User{
@Id
@Column(name="id", unique=true, nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/*********************************************
* Specific user columns here
**********************************************/
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(nullable=false, name = "idCredentials")
private Credentials credentials;
/*********************************************
* getters and setters here
**********************************************/
}
@Entity
@Table
public class Admin{
@Id
@Column(name="id", unique=true, nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/*********************************************
* Specific admin columns here
**********************************************/
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(nullable=false, name = "idCredentials")
private Credentials credentials;
/*********************************************
* getters and setters here
**********************************************/
}
我希望有用户和用户。调用entityManager后,在相应的数据库表中更新了凭据。合并(用户),但我得到错误“重复输入'loginname'键'login\u UNIQUE”。管理实体也会发生同样的情况
提前感谢您的帮助
# 1 楼答案
出现此错误的原因可能是
merge
将分离实体的内容复制到托管实体中。因此,如果您将作为参数传递给merge
一个User
或Admin
实体(从现在起称为PERSON
),该实体包含数据库中持久化的Credentials
实体的分离的副本;那么你肯定会遇到这个问题。原因是:merge
将PERSON
实体参数的整个状态复制到相应的上下文管理的PERSON
实体中李>PERSON
参数中包含Credentials
实体李>Credentials
实体已分离,因此持久性管理器将假定此实体对应于尚未持久化的实体李>INSERT
(持久化新的Credentials
)而不是UPDATE
保存合并的{INSERT
将触发您正在获取的login
字段上的重复约束冲突,因为原始Credentials
记录存在,其中login
值正在INSERT
中使用李>编辑:(如何合并)
如果您没有更新
PERSON
中的Credentials
,那么在PERSON_DAO
中合并时,您可以:PERSON
(null
)临时删除Credentials
李>PERSON
李>Credentials
添加回新合并的PERSON
由于我无法访问您的
DAO
代码,下面是前一个代码的伪代码:如果您还想合并
Credentials
,那么(为了清洁起见)应该使用dao
层之上的service
层。在该层中实现此功能的实用方法的伪代码如下所示:希望这有帮助