java - JPA 中的持久化上下文生命周期

标签 java spring hibernate jpa

我对持久化上下文及其生命周期有点困惑。
假设我有一个简单的 DAO 类,如下所示。

public class UserDao
{
    @PersistenceContext
    private EntityManager manager;

    public User getUserById(Integer id)
    {
     return manager.find(User.class, id); 
    }

    public User getUserByName(String name)
    {
        Query q = manager.createQuery("SELECT u FROM User u WHERE u.name = ?1");
        q.setParameter(1, name);

        @SuppressWarnings("unchecked")
        List<User> list = (List<User>) q.getResultList();

        if(!list.isEmpty())
         return list.get(0);

        return null;
    }  
}  

据我了解,EntityManager 上的每次方法调用都是
就像一个事务本身一样,因此创建了一个持久化上下文
并在检索结果或执行更改后立即关闭,
并且返回的实体是分离的。

如果我错了,请纠正我。

现在,即使在上述方法之一中使用了 EntityManager 两次, 两个独立的持久性上下文将相继发挥作用, 是对的吗 ?

仅当持久性上下文尚未关闭时,EntityManager 调用才会返回托管实体,并且当我们处于事务范围内时,就会发生这种情况。

我的问题可能看起来不太清楚,但我只是希望您验证我的知识或提供澄清,感谢您的时间和耐心。

最佳答案

PersistenceContext 一直存在,直到 EntityManager 关闭。 EntityManager 何时关闭,取决于 EntityManager 的范围以及它是由您的应用程序还是 JavaEE 容器管理。详情请参阅此处:http://piotrnowicki.com/2012/11/types-of-entitymanagers-application-managed-entitymanager/

关于java - JPA 中的持久化上下文生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33442927/

相关文章:

java - Spring Boot 无法引用 YAML 文件中的节点。没有该属性

java - CouchDb - MongoDb 和 NoSQL 数据库比较(使用 XML 文档)

java - JpaRepository 不支持 DML 操作 [删除查询]

java - 数字太长无法传递给 Random()?

java - 即使正确设置编码后,也无法在 mysql 中插入 CAFÉ

java - 在 Java 代码中嵌入密码的最安全方法是什么?

java - 如何在没有 [...] 和 , 分隔符的情况下打印 Map 中的值(字符串)?

JavaFX + Spring boot 实现

java.sql.SQLException : ORA-01843: not a valid month when calling a procedure

java - 查看缓存的命中和未命中