Spring,Hibernate,JPA-为什么我不使用实体管理器,为什么casacdeType.Persist仅与实体管理器一起使用

我正在测试级联的工作方式,遇到了一些令我困惑的东西。我有两个简单的实体:

@Entity
public class Child {

    @Id
    Long id;

    @OneToOne()
    @JoinColumn(name = "JOINCOLMN",referencedColumnName = "ID")
    Person person;
}

@Entity
public class Person {

    @Id
    Long id;

    @OneToOne(mappedBy = "person",cascade = CascadeType.ALL)
    Child child;

}

我正在测试级联类型的持久性。所以我写了这段代码:

Person person = new Person();
        person.setId(100L);
        person.setName("SomeName");
        Child child = new Child();
        child.setId(60L);
        child.setPerson(person);
        personRepository.save(person);

但是,即使他们两个都被假设要坚持下去,也只有这个人会坚持下去。所以第一个问题是:

  • 为什么这不起作用?

我搜索了一下,发现使用Hibernate实体管理器的人。这是持久级联类型起作用的示例:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Author a = new Author();
a.setfirstName(“John”);
a.setLastName(“Doe”);

Book b1 = new Book();
b1.setTitle(“John’s first book”);
a.getBooks().add(b1);

Book b2 = new Book();
b2.setTitle(“John’s second book”);
a.getBooks().add(b2);

em.persist(a);

em.getTransaction().commit();
em.close();

我的第二个问题是:

  • 我可以看到实体管理器用于管理交易和管理实体。但是我从不使用它,那么我的代码会发生什么呢?谁管理交易?谁保留实体?
syiaeb7420 回答:Spring,Hibernate,JPA-为什么我不使用实体管理器,为什么casacdeType.Persist仅与实体管理器一起使用

Spring JPA可以通过使用存储库或@Transactional批注来帮助您管理事务。它基本上包装了任何方法,因此该方法的核心是在事务中执行的。 对于您来说,调用ConcurrentModificationException将打开一个事务并将更改提交到数据库。

关于您的第一个问题,问题来自您的personRepository.save(person)关系及其设置者的实现。呼叫@OneToOne不会设置该人的孩子。因此,在调用child.setPerson(person);时,由于此人的孩子为null,因此没有持久的Child对象。

您要确保对象状态保持一致:

personRepository.save(person)
本文链接:https://www.f2er.com/3169806.html

大家都在问