我想评估现有项目的 JPA。数据库模型和 java 类存在,并且当前通过自行生成的代码进行映射。数据库模型和 java 类并不完美地结合在一起 - 但自定义映射工作得很好。尽管如此,JPA 的总体使用似乎还是值得一试。
如您所见,我是 JPA 新手,必须使用 xml 配置进行工作。目前我正在研究一个使用连接表的一对多单向关系(请不要在这里讨论这个场景)。
A (one - relationship owner) <-> AB (JoinTable) <-> B (many)
表格看起来像这样
A
--
ID
BREF
...
B
--
ID
...
AB
--
A_BREF (foreign key to a reference column in A which is NOT the id)
B_ID
我想为 A 类定义一个单向一对多关系。
class A {
private List<B> bs;
}
并这样做:
<one-to-many name="bs">
<join-table name="ab">
<join-column name="a_bref">
<referenced-column-name name="bref" />
</join-column>
<inverse-join-column name="b_id">
<referenced-column-name name="id" />
</inverse-join-column>
</join-table>
</one-to-many>
尽管这不会强制出现错误,但它不起作用。问题是连接表不适用于 A 的 ID 列。选择“B”实体的查询适用于A.ID
列值而不是A.BREF
用于选择实体的列值。
(如何)我可以使这个映射工作(我使用 eclipselink 2.2.0)?
感谢您的任何建议!
EDIT:
查看@SJuan76 答案中提供的链接后,我稍微修改了我的映射
<one-to-many name="bs">
<join-table name="ab">
<join-column name="a_bref" referenced-column-name="bref" />
<inverse-join-column name="b_id" referenced-column-name="id" />
</join-table>
</one-to-many>
现在这会导致以下错误(使用 eclipselink 2.1.0 和 2.2.0 进行测试)
eclipselink 2.1.0
异常描述:参数
查询选择中的名称 [bref]
标准不匹配任何参数
查询中定义的名称。
eclipselink 2.2.0
异常描述:参考
映射到的列名称 [bref]
元素 [field bs] 不
对应于有效字段
映射参考。
顺便说一句 - 如果我删除referenced-column-name="bref"
从定义中我得到了相同的例外referenced-column-name="id"
在 inverse-join-column 元素上。所以我怀疑我是否理解了referenced-column-name
正确的。我用它来指定与连接表相关的表的数据库列名称。它是否正确?
SOLUTION:
我的 szenario 中的最后一个错误是我没有在类中定义 BREF 字段
class A {
private long bref; // missing !
private List<B> bs;
}
并在我的orm.xml
该类的映射文件
<basic name="bref">
<column name="bref" />
</basic>
我不知道我必须定义使用的连接映射referenced-column-name
我的映射类中某处的属性(因为我也没有连接表本身或name
join-column/inverse-join-column 的属性映射到类或类成员。)
检查案例问题的提示对我也很有帮助。我现在觉得指定映射非常冗长,因为我用小写值覆盖了所有默认(大写)映射。由于我的数据库不区分大小写,如果需要特殊映射来使用默认值,我将使用大写表示法。
所有人+1!