Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 JPA更新父-子_Java_Hibernate_Jpa_Spring Boot - Fatal编程技术网

Java JPA更新父-子

Java JPA更新父-子,java,hibernate,jpa,spring-boot,Java,Hibernate,Jpa,Spring Boot,我有两个人和地址。人是父母,地址是孩子 个人:个人PK,身份 地址:addressPK,人员,状态 我的存储库正在扩展JPARepository。 personRepository.save(个人) 这是一个很好的工作插入。 但是当我通过更新两个表中的状态(例如:Active)并使用personRepository.save(person)来更新person对象时我的外键引用(person_fk)设置为空 我的家长班级: @Entity @DynamicUpdate @Table(name

我有两个人和地址。人是父母,地址是孩子

  • 个人:个人PK,身份
  • 地址:addressPK,人员,状态
我的存储库正在扩展JPARepository。
personRepository.save(个人)
这是一个很好的工作插入。
但是当我通过更新两个表中的状态(例如:Active)并使用
personRepository.save(person)来更新person对象时我的外键引用(person_fk)设置为空

我的家长班级:

@Entity
@DynamicUpdate
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="person_pk", nullable=false)
    private Long personPK;
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST)
    private Set<Address> addresses = new HashSet<>();
    ...
}
从我的服务层,我正在使用以下工具进行更新:
personrepository.save(个人)

有人能帮我解释一下我做错了什么吗?

首先更改:

@ManyToOne
@JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable=false)
private Address address;
致:

然后改变:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST)
private Set<Address> addresses = new HashSet<>();
然后使用:

person.addAddress(address);
persist(person)


您能否显示发生故障的代码(您的更新逻辑)@shadab我猜在您的
地址
实体中您需要一名成员:
私人而不是
专用地址?@sanastasiadis我相信他没有分享完整的代码,因为如果这是完整的代码,那么它在添加中也会失败,对吗?@AmerQarabsa是的,insert似乎也不是这样工作的。可能是复制粘贴错误?我必须从@JoinColumn注释中删除referencedColumnName才能部署它,但一旦我删除了,它就工作得很好。有了它,我得到了这个异常:MappingException:在org.hibernate.mapping.Table(person)及其相关的超表和辅助表中找不到逻辑名为person\u pk的列
@OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST)
private Set<Address> addresses = new HashSet<>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Address> addresses = new HashSet<>();
public void addAddress(Address address) {
    address.setPerson(this);
    addresses.add(address);
}
person.addAddress(address);
persist(person)
merge(person);