JPA 更新父子项

sha*_*dab 3 java hibernate jpa spring-boot

我有 2 个对象和地址。人是父母,地址是孩子。

  • 人物:人物PK,状态
  • 地址 : addressPK, person_fk, status

我的存储库正在扩展 JPARepository。 personRepository.save(person); 插入工作正常。但是当我通过更新两个表中的状态(例如:Active)并使用personRepository.save(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<>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

还有我的孩子班:

@Entity
@DynamicUpdate
@Table(name = "address")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_pk")
    private Long addressPK;
    @ManyToOne
    @JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable=false)
    private Address address;
    ...
}
Run Code Online (Sandbox Code Playgroud)

从我的服务层,我正在使用以下方法更新它: personRepostiry.save(person);

任何帮助我在这里做错了什么?

Roh*_*ini 6

首先改变:

@ManyToOne
@JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable=false)
private Address address;
Run Code Online (Sandbox Code Playgroud)

到:

@ManyToOne(targetEntity = Person.class)
@JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable = false)
private Person person;
Run Code Online (Sandbox Code Playgroud)

然后改变:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST)
private Set<Address> addresses = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

到:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Address> addresses = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的 Person 类中:

public void addAddress(Address address) {
    address.setPerson(this);
    addresses.add(address);
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

person.addAddress(address);
persist(person)
Run Code Online (Sandbox Code Playgroud)

或者

merge(person);
Run Code Online (Sandbox Code Playgroud)