gpt4 book ai didi

java - 使用连接表的 JPA 一对多单向关系

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:23 24 4
gpt4 key购买 nike

我想在现有项目上评估 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)?

感谢任何建议!


编辑:

查看@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

Exception Description: The parameter name [bref] in the query's selection criteria does not match any parameter name defined in the query.

eclipselink 2.2.0

Exception Description: The reference column name [bref] mapped on the element [field bs] does not correspond to a valid field on the mapping reference.

顺便说一句 - 如果我从定义中删除 referenced-column-name="bref" 我会得到与 referenced-column-name="id"< 相同的异常 在 inverse-join-column 元素上。所以我怀疑我是否理解了 referenced-column-name 是否正确。我用它来指定与连接表相关的表的数据库列名。这是正确的吗?


解决方案:

我的 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!

最佳答案

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

关于java - 使用连接表的 JPA 一对多单向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6277858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com