【问题标题】:Spring PersistanceContext,EntityManager and working with your databaseSpring PersistanceContext、EntityManager 和使用您的数据库
【发布时间】:2019-02-24 17:14:39
【问题描述】:

我一直在开发一些基本的 Spring Web 应用程序,但在正确管理我的数据库方面遇到了一些麻烦。从现在开始,我一直在使用基本的 JPA 存储库,经典的 save() 和 findById(long id) 已经为我完成了这项工作。但是最近我注意到,当我从数据库中获取一个对象并对其进行更改时,它不会被持久化。这导致我搜索问题标题中的所有内容。我的发现真的让我很困惑,所以也许有人可以为我澄清一下:

  • 我注意到有些人使用 Session(来自持久性)和 有些使用EntityManager。为什么?
  • 有人说你必须注入一个EntityManagerFactory,并从那里得到一个EntityManager,这是真的吗?为什么?
    • 我无法正确执行此操作,在遵循一两个指南之后,还有其他人想给我解释一下如何操作吗?
    • 我已经看到 EntityManagerFactory 以一千种不同的方式注入(相当混乱),哪种方式最好?
  • 我看过这个Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 这给了我一个 entityManager 可以使用,但我遇到了错误,有人说:With regards to the original question about obtaining an EntityManagerFactory in a non-spring setting. You simply call Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);,这个非弹簧设置是什么?
  • 如果我在一个简单的 H2 数据库或 mysql 数据库上进行开发,是否有区别?
    • 链接到一个好的和最新的教程或一本书的推荐,涵盖这个,我在课堂上学习这个,他们从来没有提到任何关于持久性上下文和实体管理的东西,所以我很困惑。

【问题讨论】:

  • 最近我注意到,当我从数据库中获取一个对象并对其进行更改时,它不会被持久化:只有当你从事务方法中这样做时才会发生这种情况。如果不这样做,那么一旦存储库方法返回,您加载的实体就会变为非托管(分离)。
  • 所有这些似乎都是我已经知道该怎么做的事情。我对 entityManager 感兴趣,并且对实体进行操作并将其保存到数据库中。还是您的链接中有另一章我找不到?
  • 如果您确实需要在 Spring 应用程序中获取 EntityManager,只需使用 @PersistenceContext EntityManager entityManager 注入它。 docs.spring.io/spring/docs/current/spring-framework-reference/…

标签: java database spring persistence


【解决方案1】:

spring DAO有四种使用方式:

  • JdbcTemplate + Spring DAO 支持(您将使用 JdbcTemplate 类)
  • Hibernate+ Spring DAO 支持(您将使用 SessionFactory 类)
  • JPA + spring DAO 支持(您将使用 EntityManager 类)
  • JPA + Spring Data(DAO 的高级抽象)

JDBC、Hibernate、JPA 是独立的技术。如果您将学习hibernate,您将学习如何使用SessionFactoryjpaEntityManager 相同。 Spring Data 是 spring 中用于访问数据库的另一个抽象。

有关spring DAO支持的更多信息,请查看文档here

【讨论】:

  • 我正在使用 JPA 存储库,而 Hibernate 会映射到数据库,所以我使用的是哪种技术?
  • 如果您使用的是 JPA 存储库接口,那么您使用的是 spring Data。那么就不需要直接使用EntityManager或者SessionFactory了。
  • 那我该如何解决这个问题呢? personRepository.save(someguy) personRepository.findById("1").setName("BlaBla") 另一个名字不会被持久化。我知道我可以做 Person temp=personRepository.findById("1"); temp.setName("BlaBla") personRepository.save(temp);但是两次储蓄不是很糟糕吗?如果不知道如何操作实体,我也不会遇到更多问题吗?
  • 你有没有调用 CrudRepository.save(person) 方法来保存它?如果您使用弹簧数据,这是持久化实体的方法。
  • 是的,但是如果在一个方法中我想改变它的名字,在我得到它并改变它的名字之后,我应该再次保存吗?这还不错吗?它是否知道它与我使用的实体相同,因此我可以更改它?
猜你喜欢
  • 2010-11-09
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2012-05-24
  • 2017-02-01
  • 2021-12-02
相关资源
最近更新 更多