为了账号安全,请及时绑定邮箱和手机立即绑定

Spring、Hibernate、JPA - 为什么我不使用实体管理器

Spring、Hibernate、JPA - 为什么我不使用实体管理器

慕少森 2024-01-25 23:03:55
我正在测试级联的工作原理,并遇到了一些让我困惑的事情。我有两个简单的实体:@Entitypublic class Child {    @Id    Long id;    @OneToOne()    @JoinColumn(name = "JOINCOLMN", referencedColumnName = "ID")    Person person;}@Entitypublic 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();我的第二个问题是:我可以看到实体管理器用于管理事务和管理实体。但我从来没有使用过它,那么我的代码中发生了什么?谁管理交易?谁持久化实体?
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


关于你的第一个问题,问题来自于你的@OneToOne关系及其设置者的实现。调用child.setPerson(person);不会设置该人的孩子。因此,当调用 时personRepository.save(person),由于该人的孩子为 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);


查看完整回答
反对 回复 2024-01-25
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信