当前位置: 首页 > 知识库问答 >
问题:

为什么hibernate持久性上下文在事务之外不可用?

韩智敏
2023-03-14

Vlad关于如何修复MultipleBagsException的示例将是我们的起点:如何修复MultipleBagsException-Vlad Mihalcea

utx.begin();
List<Post> posts = entityManager.createQuery("""
    select distinct p
    from Post p
    left join fetch p.comments
    where p.id between :minId and :maxId""", Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
 
posts = entityManager.createQuery("""
    select distinct p
    from Post p
    left join fetch p.tags t
    where p in :posts""", Post.class)
.setParameter("posts", posts)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
utx.rollback();
<persistence-unit name="some-p-unit-name">
    <jta-data-source>java:/jdbc/someDB</jta-data-source>
</persistence-unit>  

EntityManager的定义如下:

    @PersistenceContext(type = PersistenceContextType.EXTENDED, unitName = "some-p-unit-name")
private EntityManager em;

@Produces
@RequestScoped
@SomeResource // this is an annotation to differentiate it from another entity manager that can also be injectable
public EntityManager getEm() {
    return em;
}

那么,为什么我们需要启动事务以便启用PersistenceContext,即使我们将其设置为使用扩展上下文呢?

共有1个答案

袁运良
2023-03-14

谢谢@smutje给我找到了正确的答案。在我们的例子中,解决方案是用@statefult注释定义EntityManager的类,根据文档,PersistenceContext仅适用于容器管理场景中的有状态EJB。

下面的示例代码。请注意有状态注释和持久化上下文type=extended。

@Stateful
public class Resources {
    @PersistenceContext(type = PersistenceContextType.EXTENDED, unitName = "some-p-unit-name")
    private EntityManager em;

    @Produces
    @RequestScoped
    public EntityManager getEm() {
        return em;
    }
}
 类似资料:
  • 问题内容: 事务范围的持久性上下文和扩展的持久性上下文之间有什么区别? 问题答案: 在JSR-220 Enterprise JavaBeans 3.0规范中清楚地解释了差异: 5.6容器管理的持久性上下文 (…) 可以将容器管理的持久性上下文定义为具有范围为单个事务的生存期或跨越多个事务的扩展生存期,这取决于创建容器时所指定的生存期 。该规范分别将这种持久性上下文称为 事务范围的持久性上下文 和

  • 问题内容: 我是Java世界和JPA的新手。我在学习JPA时遇到了许多新术语,例如Entity,persistence。在阅读时,我无法理解 Persistence Context 的确切定义。 谁能用简单的外行术语解释它?与中使用的数据有什么关系? 例如,我发现此定义太复杂而难以理解: 持久性上下文是一组实体,因此对于任何持久性标识,都有一个唯一的实体实例。 问题答案: 持久性上下文处理一组实体

  • 持久性上下文是一组实体,因此对于任何持久性标识都有一个唯一的实体实例。

  • 我正在使用Spring Boot 1.5.2。发布和一个PostgreSQL 9.5数据库。 文件实体: 文件存储库看起来像: 当我保存新文件(使用flush)并对其执行更新,然后从存储库获取该文件后,我就有了过时的实体。但是,当我在执行修改查询之前在上执行[1]时,我会得到更新的实体: 这个问题与这个问题非常相似:Spring Boot数据JPA-修改更新查询-刷新持久性上下文。但在我的例子中,

  • 我正在使用Wildfly 10.0。0最终版本、JavaEE7、Maven和JPA2.1。当我查询数据库中的记录时,它可以正常工作并列出员工,但当我尝试保留新员工时,它会给我以下异常: 我正在尝试使用JSF和CDI bean实现这一点。我有一个JTA数据源,我在persistence.xml文件中配置了它: CDI豆可以在下面看到。这是相对简单的,有一个方法列出25名员工和另一个应该坚持一个特定的

  • 尊敬的Infinispan社区 我在EAP和Spring部署中运行应用程序。将依赖项从EAP 7.1迁移到EAP 7.2后,我在spring模式下收到警告: