无注释迁移Hibernate到JPA

7
我有一个大型的非Java EE、基于JSF的Web应用项目。我们的系统是分层的(从源代码的角度来看):有一个数据模型包,建立在此之上的是DAO包。我们在DAO包中专门使用Hibernate的XML配置映射。我们真的不想用注释来混淆数据模型,但并不是特别依赖Hibernate(除了映射比较复杂)。
我正在考虑向Java EE迈进,并将我们的DAO对象构建为EJB。但由于我们不想放弃Hibernate的XML,这引发了我几个问题:
  • 是否可以在模型上没有JPA注释的情况下使用Hibernate与JPA?
  • 如果不行,我的EJB是否仍然可以与Hibernate进行事务处理?我认为这被称为JTA支持,但不确定。我喜欢免费获得事务的想法;现在我们有一个自定义的阶段监听器来处理Hibernate事务,我想要删除它。
  • 是否有一种方法可以从Hibernate的XML映射配置迁移到某种JPA XML映射?我没有看到这样做的方法,但显然将我们与Hibernate的耦合降到最低会更好。
谢谢!
2个回答

9
有没有可能在模型上不使用JPA注释而使用Hibernate与JPA一起使用?
是的,这是完全可能的。您可以在JPA标准映射文件orm.xml中指定对象模型类的所有相关属性。您也可以拥有自己的映射文件,但需要在persistence.xml中指定它们。
如果不行,我的EJB是否仍然可以使用Hibernate进行事务处理?我想这被称为JTA支持,但不确定。
如果您正在使用EJB,则会发现容器管理的事务非常有用。您只需要在EJB上注释所需的@TransactionManagement@TransactionAttribute注释,容器将自动为您管理事务,包括在方法结束时提交事务(如果适用),并在运行时异常或应用程序异常的情况下回滚事务。

所有EntityManager实例,即所有持久化上下文,注入到这样的EJB中,都会自动与底层JTA事务关联。请注意,只有在允许容器注入EntityManager实例时才成立。如果您自己管理持久性上下文(通过从EntityManagerFactory实例创建它们),则可能需要调用EntityManager.joinTransaction()将持久性上下文中执行的所有工作与底层JTA事务相关联。这是必要的,因为如果您已配置持久性上下文以使用JTA数据源,则EntityManager通常会将自身与底层JTA事务关联起来。如果没有JTA事务存在,则不会发生此类关联,因此如果要将更改刷新到数据库,则必须加入活动的JTA事务。

有没有一种方法可以从Hibernate的XML映射配置迁移到某种JPA XML映射?我不知道是否有这样的工具,因为我从未进行过迁移项目,但这并不意味着没有为此目的服务的工具。您可能需要查看Hibernate工具项目,它支持JPA,尽管我不确定它是否允许您将Hibernate XML格式转换为JPA格式。

5
是的,JPA也支持XML映射。除了标准的之外,您还可以使用和其他xml文件根据JPA xml架构声明实体。此处提供参考链接:Reference
至于事务性EJB-是的,它们可以进行事务处理(在模型上有或没有JPA注释)。

它们能否使用标准的Hibernate机制而不是JPA机制进行事务处理? - Daniel Lyons
它们肯定可以通过JPA实现。而JPA只是简单地封装了Hibernate。请查看@TransactionAttribute http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接