gpt4 book ai didi

java - JPA (orphanRemoval = true) 实现

转载 作者:行者123 更新时间:2023-11-30 07:42:01 28 4
gpt4 key购买 nike

我一直在阅读有关 orphanRemoval= true 的帖子在 JPA 中。根据文档:

orphanRemoval is a flag -

Whether to apply the remove operation to entities that have been removed from the relationship and to cascade the remove operation to those entities.

我还提到了 this article有关更多信息,他们试图将子实体(地址 - 在他们的示例中)设置为 null。

我目前理解制作 orphanRemoval= true将执行与 cascade=CascadeType.REMOVE 类似的操作并且如果我删除我的父实体,它也会删除子实体。

我想测试的是它带来的附加功能,即删除未被其父实体引用的实体。

我正在尝试创建一个类似的场景,我将新的手机集合设置为 new ArrayList<>()其中父实体是 Person

以下是我的实体类。

人.java

@Entity
@Table(name = "person")
@Data
public class Person {

@Id
int pd ;
String fname;
String lname;

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="person",orphanRemoval=true)
List<Phone> phones = new ArrayList<>() ;

public boolean addPhone(Phone phone) {
boolean added = this.phones.add(phone);
phone.setPerson(this);
return added;
}
}

电话.java

@Entity
@Table(name = "phone")
@Data
public class Phone {
private int countryCode;
@Id
private String number ;

@ManyToOne
@JoinColumn(name="fk_person")
Person person ;

}

主类

public void testFlow() {

Person p = fetchById(765);
p.setPhones(new ArrayList<>());
personRepo.save(p); **// exception on this line**
getPersons();
}


public Person fetchById(int id) {

Optional<Person> pe = personRepo.findById(id);
Person person = pe.get();
System.out.println("person is :"+ person.getFname());
System.out.println("cc is :"+ person.getPhones().get(0).getNumber());

return person;

}

public List<Person> getPersons() {

List<Person> persons = personRepo.findAll();
persons.forEach(p -> {
System.out.println("person :"+p.getPd());
System.out.println("person phones :"+p.getPhones().get(0).getNumber());
System.out.println("=================================");
});
return persons;
}

入口方法是testFlow()

当我执行这段代码时,出现错误:

org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: com.example.entity.Person.phones

关于如何测试 orphanRemoval 的工作示例的任何线索?

最佳答案

问题是由以下行引起的:

p.setPhones(new ArrayList<>());

在 Hibernate 中,如果关联指定了 orphanRemoval = true,则不能覆盖从持久性上下文中检索到的集合。如果您的目标是最终得到一个空集合,请改用 p.getPhones().clear()

关于java - JPA (orphanRemoval = true) 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259663/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com