我目前正在使用hibernate和JPA开发一个Java EE项目,我正面临着一个我真的不知道如何处理的问题。这是项目的布局:
有一个模块,我们称之为module A
,它有一个persistence.xml和许多映射到数据库的实体。我即将添加新功能,并且由于新功能有自己的职责,我有一个新模块module B
,它有自己的persistence.xml。 module A
和module B
都被部署为JBoss中的耳朵。
数据库的设计(最终且无法更改)要求module B
中的某个实体在module A
中拥有外键。在B的persistence.xml中,我向外键添加了<class>
- 标签,以便hibernate可以找到它。外键实体类本身就引用了其他实体,因此我不得不将它们添加到persistence.xml中。我的问题是其中一个实体有一个构造函数表达式jpql查询,从实体中选择数据到通常的POJO。在module B
当hibernate尝试解析所有<class>
- 标记时,它会抱怨JPQL查询无效(因为它不知道POJO)。有没有办法让模块B中的持久性单元知道这个对象?我真的希望保留module A
中的所有类都不受影响,因为它们是一种“遗留代码”,我知道它已经可以工作(将它们分解可能会破坏模块A的结构)。
答案 0 :(得分:0)
我终于找到了问题,这是我的修复。
当我使用module A
标记专门添加从module B
到<class>
的类时,我偶然添加了一个超类,其中包含hibernate认为错误的查询。实际上,如果仅查看该超类,则该查询是错误的,因为其中一个变量仅可用
在子类中(查询如下所示:select new MyPojoClass(x.id, x.var1, x.var2, x.variableAvailableInSubClass) from MyTable x
)。为了解决这个问题,我改为使用<class>
添加所有子类,使hibernate能够解析所有依赖项和查询。