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

标签 java spring hibernate spring-boot jpa

我正在测试级联的工作原理,并遇到了一些让我困惑的事情。我有两个简单的实体:

@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();

我的第二个问题是:

  • 我可以看到实体管理器用于管理事务和管理实体。但我从来没有使用过它,那么我的代码中发生了什么?谁管理交易?谁持久化实体?

最佳答案

Spring JPA 可以帮助您使用存储库或 @Transactional 注释来管理事务。它基本上包装了任何方法,因此该方法的核心是在事务中执行的。 在您的例子中,调用 personRepository.save(person) 打开一个事务并将更改提交到数据库。

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

您希望确保保持对象状态一致:

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

关于java - Spring、Hibernate、JPA - 为什么我不使用实体管理器,为什么 casacdeType.Persist 只能与实体管理器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685416/

相关文章:

java - 使用注释和 lombok 的字段切入点

mysql - 如何解决使用 hibernate 5 和 mysql 出现 HHH000346 错误?

java - 带有数字和下一个、上一个的 Jpa 分页

java - 将 Jackson JSON 库与 Jersey + Jetty 一起使用

java - 在运行时将 Project Loom 技术检测为缺失或存在 JVM

java - 异步任务流程

java - Java/WebLogic 应用程序中的集成 Windows 身份验证 (NTLM)?

Spring Boot,决定为REST和JPA分别创建DTO对象

java - 具有凭证安全性的 Spring token 安全性(spring boot)

database - JPA - 计算列作为实体类属性?