我一直在阅读JPA中关于orphanremoval=true
的文章。根据文件:
我试图创建一个类似的场景,将新的电话集合设置为new ArrayList<>()
,其中父实体是Person。
下面是我的实体类。
@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;
}
}
@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()。
hibernate.hibernateException:拥有实体实例:com.example.entity.person.phones不再引用具有cascade=“all-delete-orphan”的集合
如何测试orphanremove
的工作示例?
这是应该引发异常的行:
personRepo.save(p);
发生这种情况是因为您试图保存person
,而phone
没有引用任何phone
。我的意思是,您只取消引用person
,而不取消引用phone
实体。由于这是一个双向关系,您必须取消引用这两个关系:
public void testFlow() {
Person p = fetchById(765);
p.getPhones().foreach(ph -> ph.setPerson(null));
p.setPhones(new ArrayList<>());
personRepo.save(p); **// exception on this line**
getPersons();
}
问题内容: 在我的应用程序中,我将JPA 2.0与Hibernate一起用作持久性提供程序。我在两个实体之间使用一对多关系(使用a 和not )。我想知道如何在JPA批注中指定(如中所述)来反转关系所有者。 谢谢。 问题答案: 我找到了答案。@OneToMany批注的maptedBy属性的行为与xml文件中的inverse = true相同。
重要提示:如果你正在阅读这篇文章,那么也考虑看看这篇文章进行深入讨论。 这是一个非常常见的做法/情况/要求,其中一个父级的子级可以迁移到另一个父级。如果在这种关系的反面将设置为会发生什么? 考虑作为示例,任何简单的一对多关系如下。 反面(部门) : 拥有方(员工): 在合并如下操作/动作时(其中< code>department是由客户端提供的分离实体), 当然,添加和删除员工可能最好使用关联实体
现在,当我启动Spring Data JPA时,我的印象是Spring Data JPA是JPA规范的独立实现。原来我错了。 如果我理解正确的话,Spring Data JPA是Spring提供的一个抽象层,它在内部使用其他JPA提供者(例如Hibernate),所以通常如下所示:
有疑问,顺其自然 下面是我想我会得到的常见建议: 不,我不想将其更改为JSQL并执行“新POJO”。 为什么?因为我有一个复杂的sql查询,它不能反射到JSQL。 不,我不会提出查询。我只想知道如何使用将上面的示例映射到POJO。谢谢
我是Criteria API的新手,我正在尝试创建一个对< code>B类型的实体进行计数的查询,其中< code > a . some method(B)= = true 。 我的实体: 我不知道使用JPA是否可以做到这一点,但我已经勾勒出了这个: 问题是我不知道如何创建与 一起使用的表达式。我的意思是,我甚至不知道我是否应该使用 来解决这个问题。 那么,有人能帮我吗?目前,我正在从数据库获取类
当我将Java EE应用程序部署到Glassfish时,我有一个非常奇怪的问题。我有一个Eclipse EAR项目,它引用了一个Web项目(包含一个servlet),一个EJB项目(有一个EJB)和一个JPA项目(有一个@Entity)。在我的 servlet 中,我调用 EJB,它又执行以下查询: 在上面代码的第三行,我得到了一个异常: 我已经调试了上面提到的Hibernate类,即Metamo