使用联接表的 JPA 一对多单向关系

2024-01-06

我想评估现有项目的 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我的映射类中某处的属性(因为我也没有连接表本身或namejoin-column/inverse-join-column 的属性映射到类或类成员。)

检查案例问题的提示对我也很有帮助。我现在觉得指定映射非常冗长,因为我用小写值覆盖了所有默认(大写)映射。由于我的数据库不区分大小写,如果需要特殊映射来使用默认值,我将使用大写表示法。

所有人+1!


您可以尝试将字段定义为“BREF”或在属性映射上定义它时使用的相同大小写,或者您可以尝试将 eclipselink.jpa.uppercase-column-names 持久性属性设置为 true。当引用列名称 =“bref”被删除时,这可能是“id”的问题,因为实体中的字段可能默认为“ID”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用联接表的 JPA 一对多单向关系 的相关文章

随机推荐