gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:54 24 4
gpt4 key购买 nike

我正在尝试集成 Spring 和 JSF,但我坚持持久对象。我不想处理事务(开始 - 提交等)

经过一番谷歌搜索后,我可以找到一个答案,给出我所需要的in this link

我使用 eclipselink 作为 ORM 和 Oracle 11g 数据库以及带有 Maven 的 Glassfish 服务器 3.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 但不会生成其他日志,但如果我在下面编写代码,则不可见部分与 aboe 代码块相同;

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

它保留对象。这可行,但我不想处理 begin() commit() 部分,并且使用 JTA 容器管理持久性的资源应该代替我来执行此操作。谁能告诉我我错在哪里提前谢谢

最佳答案

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

    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();
}

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

关于java - JPA - 容器管理的持久性不持久化实体 - JTA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com