一尘不染

无需注释即可将Hibernate迁移到JPA

hibernate

我有一个大型的非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的耦合会更好。

谢谢!


阅读 383

收藏
2020-06-20

共1个答案

一尘不染

是否可以在模型上没有JPA注释的情况下将Hibernate与JPA一起使用?

是的,这很有可能。您可以在JPA标准映射文件-
中指定对象模型类的所有相关属性orm.xml。您也可以拥有自己的映射文件,但是您需要在中指定它们persistence.xml

如果不是,我的EJB是否有可能与Hibernate进行事务处理?我认为这称为JTA支持,但不确定。

如果您使用的是EJB,则会发现容器管理的事务非常有用。您需要做的就是用必需的@TransactionManagement@TransactionAttribute注释为EJB
注释,容器将自动为您管理事务,包括在方法末尾提交事务(如果适用),并在事件发生时回滚事务。运行时异常或应用程序异常。

EntityManager注入到此类EJB中的所有实例(即所有持久性上下文)将自动与基础JTA事务关联。请注意,仅当您允许容器注入EntityManager实例时,这才是正确的。如果您自己管理持久性上下文(通过从EntityManagerFactory实例创建持久性上下文),则可能必须调用EntityManager.joinTransaction()将持久性上下文中执行的所有工作与基础JTA事务相关联。EntityManager如果您已将持久性上下文配置为使用JTA数据源,则这通常是必要的,因为通常将其自身与基础JTA事务相关联。如果不存在JTA事务,那么将不会发生这种关联,因此,如果您想将更改刷新到数据库,则必须加入活动的JTA转换。

有没有办法从Hibernate的XML映射配置迁移到某种JPA XML映射?

我没有意识到任何这样的工具,因为我从来没有迁移过项目,但这并不意味着没有任何工具可以满足此目的。您可能想看一下确实支持JPA 的Hibernate
Tools
项目,尽管我不确定它是否允许您从Hibernate
XML格式转换为JPA格式。

2020-06-20