当前位置: 首页 > 面试题库 >

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

法池暝
2023-03-14
问题内容

我有一个大型的非Java
EE,基于JSF的Web应用程序项目。我们的系统是分层的(在源代码中):有一个数据模型包,它是DAO包的基础。我们仅在DAO包中使用Hibernate的XML配置映射。我们确实不想将数据模型与注释混淆在一起,但是我们并没有特别地将其绑定到Hibernate(除非映射非常复杂)。

我强烈考虑向Java EE迈进,并将DAO对象构建为EJB。但是由于我们不愿放弃Hibernate的XML,这使我想到了几个问题:

  • 是否可以在模型上没有JPA注释的情况下将Hibernate与JPA一起使用?
  • 如果不是,我的EJB是否有可能与Hibernate进行事务处理?我认为这称为JTA支持,但不确定。我喜欢“免费”获得交易的想法;现在,我们要删除一个处理Hibernate事务的html" target="_blank">自定义编码的阶段侦听器。
  • 有没有办法从Hibernate的XML映射配置迁移到某种JPA XML映射?我没有办法做到这一点,但是显然减少与Hibernate的耦合会更好。

谢谢!


问题答案:

是否可以在模型上没有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格式。



 类似资料:
  • 我目前正在将我的项目从Hibernate HBM映射迁移到注释。就我应付小班而言,一切都很容易。但我有相同的大型类,我尝试为这个类混合映射和注释。我了解到,通过使用hibernate属性“hibernate.mapping.priority”并将其设置为“class,hbm”而不是“hbm,class”,这是可能的。(请参阅:在Hibernate中:可以为实体混合注释和XML配置吗?) 例如,我有

  • 我一直使用hibernate。cfg。配置Hibernate的xml。由于各种原因,我需要将所有配置转移到Java,并且我在映射实体方面存在问题。 以前在XML中,我的映射是这样的: 一切都是注释驱动的,所以我不需要指定其他任何东西。 现在,我使用Hibernate的配置来配置一切。类,如何添加映射?我尝试了配置。addClass(Test.class)但这会引发一个错误,即file 但是在第一次

  • 问题内容: 我正在将应用程序从Hibernate 3迁移到Hibernate5。我们使用class来获取。因此,使用对象来获取数据库表列信息,例如列大小,类型..etc。似乎在Hibernate 5 类中已弃用(已删除!)。Hibernate 5中是否有其他上课的选择?否则如何进入Hibernate 5 env? 问题答案: 当我们转向一种新的模式工具方法时,它在5.0中已被删除。Database

  • 我有一些线程,它们被赋予随机数(1到n),并被指示按排序顺序打印它们。我使用了信号量,这样我就获得了许可数=随机数,并释放了一个比所获得的多的许可。 获得=随机数;释放=1个随机数 信号量的初始许可计数为1。所以随机数为1的线程应该获得许可,然后是2,依此类推。 这是根据下面给出的文档支持的 不要求释放许可证的线程必须通过调用acquire()获得该许可证。 问题是我的程序在1代表n后卡住了 我的

  • 我正在从3迁移到Hibernate 5.0.3.final。在3.x中,我使用joda-time在oracle DB中持久化LocalDateTime。现在我看到Hibernate5不支持Joda-Time。请告诉我最好的选择是什么? 下面是代码示例。

  • 我正在使用Maven和JPA编写一个项目(不是web应用程序!)。 我编写了带注释的实体类和CRUD服务类。但是现在,我需要使用而不是来执行这些CRUD操作。 我使用Hibernate作为JPA提供程序,并且在resources文件夹下的上配置了所有内容,目前运行正常。 我知道为了创建像 , 那么我必须在META-INF下使用,但我没有这个XML。 这是我的hibernate.cfg.xml