我试图整合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容器管理持久性的资源应该这样做而不是我。任何身体都可以告诉我我错在哪里提前谢谢
答案 0 :(得分:1)
在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和自动交易一样整洁,但它会正确处理交易,并确保数据完整性。