当前位置: 首页 > 知识库问答 >
问题:

从JBoss EAP 6.1中排除JPA子系统--尝试在JBoss EAP 6.1中使用JPA2.1

叶衡虑
2023-03-14

我有一个war应用程序,它包含JPA2.1API和Hibernate4.3.0。Final(JPA2.1实现)使用Spring容器打包和引导,我想在JBoss EAP6.1中部署它。

我试图使用jboss-deployment-structure.xml排除JPA子系统,但我发现,即使我从standalone.xml中注释出JPA扩展和JPA子系统,并将JPA子系统排除放在jboss-deployment-structure.xml中(也排除了org.hibernate模块,以使用打包在应用程序中的hibernate),也不会运行JPA扫描器(如预期的那样),但只要war类(在我的例子中是Spring容器)引用javax.persistence类,就会从JBoss模块而不是war中提供的API jar。因此,很明显,我在war应用程序中的JBoss提供的API(2.0)及其实现(2.1)中发现了不匹配的异常。一个例外是,批注javax.persistence.table的索引相关属性不能被识别,因为这是JPA2.1中的一个添加,在JPA2.0中不可用

我可以通过将modules目录中的JPA2.0API替换为JPA2.1(并将module.xml指向新的2.1API jar),来解决这个问题,一切都很好。然而,我认为这不是正确的方法,因为这就像试图改变所有应用程序的服务器行为一样。

这是有意的JBoss类加载行为吗?所有规范API类(JBoss是其中的实现者)都将始终优先,无论使用的实现是什么,也无论我们告诉它使用应用程序中的特定API。我认为创建一个特定的符合规范的服务器,然后提供重写规范版本本身的方法有点矛盾,但是有没有一种方法可以在应用程序中干净地使用API和实现呢?

另一个选择是转移到Wildfly,它是JPA2.1实现,但我的问题是这在JBoss EAP6.1中是否完全可行?

共有1个答案

陆子航
2023-03-14

我们找到了另一个解决方案。
您还可以在WAR的jboss-deployment-structure.xml中排除jpa子系统:

<exclude-subsystems>
    <subsystem name="jpa" />
</exclude-subsystems>
<exclusions>
    <module name="javaee.api" />
</exclusions>
 类似资料:
  • 问题内容: 我在Web应用程序中通过Hibernate使用JPA。这是两个实体(仅显示吸气剂): 如您所见,并称为“一对多”。 现在,我需要加载一个实例,删除部分或全部子代并保存更改。以下是对我不起作用的代码: 在上面的示例中未删除子实体。现在,我必须手动为每个孩子打电话。 有没有更简单的方法来管理子代? 请注意,我不想使用特定于Hibernate的功能,只能使用纯JPA。 问题答案: 对于JPA

  • 使用粒子系统 Unity 使用一个组件实现粒子系统。在场景中放置粒子系统的常用方式是,添加一个预制的游戏对象(菜单:GameObject > Create General > Particle Syste),或者为一个现有的游戏对象添加粒子系统组件(菜单:Component > Effects > Particle System)。因为该组件相当复杂,所以检视视图被分割成数个可折叠的部分或 模块,

  • 我想在JBoss7.1中使用Hibernate4.3的多租户特性。 通过在jboss-deployment-structure中添加以下行,我设法将其包含在我的war中 并在pom.xml中添加对hibernate核心和实体管理器的依赖项 这使得Hibernate4.3可以加载,但不幸的是,我出现了一个错误 这是因为在Hibernate4.3使用JPA2.1时加载了JPA2.0 从JBoss st

  • 在mysql工作台中,我试图执行 这是一个查询,但是我收到了这个消息 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项-

  • 我有以下作者类: 我的问题是这个测试用例中的最后一个断言失败了。如果我向作者添加一本书,它就会自动添加到图书存储库中。但是如果我从存储库中移除一本书,我如何从作者那里移除它呢?

  • 问题内容: 我正在使用Entity Framework Code First开发WCF RESTful Web服务。 我的桌子上有很多列。我这样做是为了获得特定用户: 在此表上,有一个密码列,我不想返回此列。 如何从该选择中排除密码列? 问题答案: 在select语句中指定所需的每一列: