在没有注释的情况下将Hibernate迁移到JPA

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

谢谢!

是否可以在模型中使用带有JPA注释的Hibernate而不使用JPA注释?

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

如果没有,我的EJB是否有可能在Hibernate上以事务方式运行? 我认为这称为JTA支持,但不确定。

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

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

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

我没有意识到任何这样的工具,因为我从来没有必要迁移一个项目,但这并不意味着没有任何工具可以用于此目的。 你可能想看看支持JPA的Hibernate Tools项目,虽然我不确定它是否允许你从Hibernate XML格式转换为JPA格式。

是的,JPA还支持XML映射。 除了标准的persistence.xml ,还有orm.xml和其他xml文件根据JPA xml架构声明实体。 这是一个参考 。

对于事务性EJB – 是的,它们可以是事务性的(在模型上有或没有JPA注释)