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

Dan*_*ons 7 java hibernate jpa ejb-3.0

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

谢谢!

Vin*_*lds 8

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

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

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

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

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

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

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


Boz*_*zho 5

是的,JPA 也支持 XML 映射。除了标准之外persistence.xml,您还有orm.xml其他 xml 文件根据 JPA xml 模式声明实体。这里有一个参考

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