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,人员,状态
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);