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

JPA-容器管理的持久性不持久化实体-JTA

葛念
2023-03-14

我试图集成Spring和JSF,我坚持使用对象。我不想处理事务(begin-commit等)

经过一些谷歌,我可以找到一个答案,给我需要在这个链接

我使用eclipselink作为ORM和Oracle 11g数据库,并使用带有Maven的Glassfish Server3.1。我更喜欢Spring配置的注释。我用

@Transactional
@Service

相关类中的注释。我的persistence.xml名称是E_DefterManagementPU,我的事务类型是JTA。下面是我的代码,用于持久化efaFunctions

public EntityManager entityManager;

@Inject
public void setEntityManager() {
    EntityManagerFactory emf = Persistence.
            createEntityManagerFactory("E_DefterManagementPU");
    this.entityManager = emf.createEntityManager();
}    

public void create(EfaFunctions efaFunctions) {              
    entityManager.persist(efaFunctions);  
}

实体管理器不为空,在glassfish上可以看到**给对象分配序列**log,但其他日志没有生成,但如果我写了下面的代码,其中不可见的部分与上面的代码块相同;

public void create(EfaFunctions efaFunctions) {       
    entityManager.getTransaction().begin();
    entityManager.persist(efaFunctions);  
    entityManager.getTransaction().commit();
}

它将持久化该对象。这是可行的,但我不想处理begin()commit()部分,并且使用JTA容器的相关资源应该由托管持久性代替我来完成。有谁能告诉我我错在哪里吗

共有1个答案

夏兴平
2023-03-14

在JSF托管bean中,没有隐式事务。避免手动管理事务的唯一方法是在应用服务器中创建一个EJB,并让JSF托管bean调用它来持久化数据。您使用的是GlassFish,因此可以使用EJB...但这绝对是一个新的复杂程度。处理持久性事务的一个很好的方法是有一个try-catch块模板,如下所示:

    EntityManager em = ... //However you get an em.
    try {
        em.getTransaction().begin();

        // ...  Put your persistence code here.

        em.getTransaction().commit();
    } catch (Exception ex) {
        em.getTransaction().rollback();
        throw ex;
    }finally {
        em.close();
    }

它看起来不像超光滑的CDI和自动事务那样干净,但它可以正确地处理事务,并确保数据完整性。

 类似资料:
  • 我有一个用例,我想我需要两个实体管理器,它们访问相同的持久性单元。所以本质上,我希望在同一个数据库上有两个持久性上下文。这是否可以通过PersistenceContext注释实现? 我想写以下内容,但不知道如何告诉JPA注入两个不同的manager实例。 我想我可以切换到应用程序管理的事务,然后我可以使用工厂创建另一个事务。但是我不想自己管理事务,如果不是绝对必要的话。

  • 我有一个实体,代表客户发送的订单,这个订单可能会在电话上与客户讨论后更新,但客户发送的初始订单必须保持不更新。我如何可以保持同一实体两次,是否有效的使用深层克隆。我试图分离实体以便持久化上下文持久化一个新的,但是持久化上下文仍然在更新第一个条目。

  • 我有一个JavaEE项目,它使用多个持久性单元。有没有办法指定特定JPA实体所属的持久性单元?一些实体位于一个数据源中,而其他实体位于我的第二个数据源中。有没有一种方法可以通过注释来区分两者?

  • 主要内容:JPA级联持久化示例,输出结果级联持久化用于指定如果实体持久化,则其所有关联的子实体也将被持久化。 以下语法用于执行级联持久性操作 - JPA级联持久化示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步:

  • 这就是我的datasourcebean的样子

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重