我有一个大型的非 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 的耦合会更好。
Thanks!
是否可以在模型上不使用 JPA 注释的情况下将 Hibernate 与 JPA 结合使用?
是的,这是很有可能的。您可以在 JPA 标准映射文件中指定对象模型类的所有相关属性 -orm.xml
。您也可以拥有自己的映射文件,但您需要在persistence.xml
.
如果不是,我的 EJB 是否可以与 Hibernate 进行事务处理?我认为这就是所谓的JTA支持,但不确定。
如果您使用 EJB,您会发现容器管理的事务非常有用。您所需要做的就是用所需的注释来注释您的 EJB@TransactionManagement http://download.oracle.com/javaee/6/api/javax/ejb/TransactionManagement.html and @TransactionAttribute http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html注解,容器会自动为您管理事务,包括在方法结束时提交事务(如果适用),以及在发生运行时异常或应用程序异常时回滚事务。
All EntityManager http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html实例(即注入到此类 EJB 中的所有持久性上下文)将自动与底层 JTA 事务关联。请注意,只有当您允许容器注入时,这才是正确的EntityManager
实例。如果您自己管理持久性上下文(通过从EntityManagerFactory http://download.oracle.com/javaee/6/api/javax/persistence/EntityManagerFactory.html实例),那么你可能需要调用EntityManager.joinTransaction() http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#joinTransaction%28%29将持久化上下文中执行的所有工作与底层 JTA 事务相关联。这是必要的,因为EntityManager
如果您已将持久性上下文配置为使用 JTA 数据源,则通常会将其自身与底层 JTA 事务相关联。如果不存在 JTA 事务,则不会发生此类关联,因此如果要将更改刷新到数据库,则必须加入活动的 JTA 事务。
有没有办法从 Hibernate 的 XML 映射配置迁移到某种 JPA XML 映射?
我不知道有任何这样的工具,因为我从来没有迁移过项目,但这并不意味着没有任何工具可以达到这个目的。您可能想看看休眠工具 http://www.hibernate.org/subprojects/tools.html项目,它确实支持 JPA,尽管我不确定它是否允许您从 Hibernate XML 格式转换为 JPA 格式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)