【问题标题】:EntityManager and two DAO with PersistenceContextType.EXTENDEDEntityManager 和两个带有 PersistenceContextType.EXTENDED 的 DAO
【发布时间】:2011-01-17 16:51:38
【问题描述】:

我的应用程序中的实体管理器有问题。我有两个这样的 DAO 类:

@Repository
public abstract class DaoA 
{
    protected ClassA persistentClass;

    @PersistenceContext(name="my.persistence", type=PersistenceContextType.EXTENDED)
    protected EntityManager entityManager;
    -------------- some typical action for DAO --------------
}

Second DAO 用于 ClassB,看起来与 DaoA 相似。其余的事情由 Spring 框架为我完成。

当我调试应用程序时,我发现两个 DAO 对象都有不同的 EntityManager 实例。结果,我的两个不同的 DAO 与不同的 PersistenceContext 连接。

问题是这是否是正确的行为?我想为我的所有 DAO 类使用相同的 PersistenceContext。如果可能,请给我一个提示,如果我正确理解了 JPA?

问候 Hsd

【问题讨论】:

    标签: spring jpa dao entitymanager


    【解决方案1】:

    这是EXTENDED持久化上下文的正确行为,因此在这种情况下你不需要它是EXTENDED

    在大多数情况下,您需要TRANSACTIONAL 持久化上下文,这是省略type 时的默认模式:

    @PersistenceContext(name="my.persistence")
    protected EntityManager entityManager;
    

    在这种模式下,持久性上下文与事务相关联,因此所有 DAO 在同一个事务中工作时将共享相同的持久性上下文。我想这就是你需要的。

    【讨论】:

    • 感谢您的快速答复。这是否意味着许多 DAO 实例不可能只有一个 PersistenceContext 实例?
    • 只有一个附加问题。这是否可以让我的所有 DAO 共享 PersistenceContextType.EXTENDED?
    • @hsd:EXTENDED 持久化上下文的目的是创建一个与有状态对象的特定实例相关联的持久化上下文。 DAO 通常是无状态的。如果你理解它并且实际上有一个有状态的对象来调用你的 DAO 的方法,你可以将EXTENDED 上下文注入其中并将它作为参数传递给 DAO 方法。
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2017-04-07
    • 2012-10-20
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多