Java 休眠合并父集合并更新惰性子集合列表
我在执行合并父表时遇到问题,现有子记录将被插入而不是更新 例如,成员(父)表和地址(子)表Java 休眠合并父集合并更新惰性子集合列表,java,hibernate,Java,Hibernate,我在执行合并父表时遇到问题,现有子记录将被插入而不是更新 例如,成员(父)表和地址(子)表 公共类成员实现可序列化{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“id”) 私有int-id; @OneToMany(fetch=FetchType.LAZY,mappedBy=“member”,cascade=CascadeType.ALL) 公开名单地址名单; } 公共类地址实现可序列化{ @身份证 @GeneratedVal
公共类成员实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“member”,cascade=CascadeType.ALL)
公开名单地址名单;
}
公共类地址实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int地址_id;
@列(name=“member\u id”)
私有内部成员id;
@manytone(fetch=FetchType.EAGER)
@连接柱({
@JoinColumn(name=“member\u id”,referencedColumnName=“id”,insertable=false,updateable=false)
})
公共成员;
}
在执行更改和合并(成员)时,将插入地址记录,而不是更新现有记录
有人知道原因是什么吗?当您执行更改时,是否设置了正确的地址\u id。进行一些调试,并在地址表中找到与现有id匹配的地址\ id 在我的方法中,类将如下所示。我不认为需要成员id属性。因为它与成员的id属性相同 公共类地址实现可序列化{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int address_id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "member_id", nullable = false)
public Member member;
public void setMember(Member member) {
this.member = member;
}
}执行更改时,您是否设置了正确的地址\u id。进行一些调试,并在地址表中找到与现有id匹配的地址\ id 在我的方法中,类将如下所示。我不认为需要成员id属性。因为它与成员的id属性相同 公共类地址实现可序列化{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int address_id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "member_id", nullable = false)
public Member member;
public void setMember(Member member) {
this.member = member;
}
}我在您的快照代码中看不到任何父子关系 请用下面的代码修改子类的代码以创建继承关系
public class Child extends Member implements Serializable{
将子类扩展到父类(成员)将反映与延迟加载相关的所需更改。我在快照代码中看不到任何父子关系 请用下面的代码修改子类的代码以创建继承关系
public class Child extends Member implements Serializable{
将子类扩展到父类(成员)将反映与延迟加载相关的所需更改。您好,是的,我检查了地址记录中的地址id和成员id,这与我现有的记录完全相同。但是,它不会更新,而是插入一个新的记录,其中包含您在address对象中设置的成员的新地址。我没有设置它,但在调试时,我可以看到addres.member指向原始成员。我确实将我的成员对象放在spring@SessionAttributes中,可能是因为这个原因吗?这只是我表的一些示例字段,顺便说一句,成员可以有多个地址,因此它不能直接从地址id连接到成员id。当然,成员有多个地址,每个地址也有一个成员。我要声明设置该成员。所以这里的join列是member\u id。address\u id根本不用于加入。嗨,是的,我检查了address记录中的address\u id和mem\u id,它与我现有的记录完全相同。但是,它不会更新,而是插入一个新的记录,其中包含您在address对象中设置的成员的新地址。我没有设置它,但在调试时,我可以看到addres.member指向原始成员。我确实将我的成员对象放在spring@SessionAttributes中,可能是因为这个原因吗?这只是我表的一些示例字段,顺便说一句,成员可以有多个地址,因此它不能直接从地址id连接到成员id。当然,成员有多个地址,每个地址也有一个成员。我要声明的是设置那个成员。所以这里的join列是member\u id。address\u id根本不用于加入。