Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠合并父集合并更新惰性子集合列表_Java_Hibernate - Fatal编程技术网

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根本不用于加入。