当前位置: 首页 > 知识库问答 >
问题:

JPA(orphanremove=true)实现

程谭三
2023-03-14

我一直在阅读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的工作示例?

共有1个答案

方通
2023-03-14

这是应该引发异常的行:

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