编程语言
首页 > 编程语言> > java-使用联接表的JPA一对多单向关系

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

作者:互联网

我想在现有项目上评估JPA.数据库模型和java类存在,并且当前通过自身生成的代码进行映射.数据库模型和java类不能理想地组合在一起-但是自定义映射效果很好.但是,总体而言,使用JPA似乎值得一试.

如您所见,我是JPA的新手,必须进行xml配置工作.目前,我正在使用联接表处理一对多的单向关系(请不要在此讨论此szenario).

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”也会出现相同的异常.因此,我怀疑我是否正确理解了引用的列名.我用它来指定与联接表相关的表的数据库列名.这个对吗?

解:

szenario中的最后一个错误是我没有在班级中定义BREF字段

class A {
    private long bref; // missing !
    private List<B> bs; 
}

在我的orm.xml映射文件中

<basic name="bref">
    <column name="bref" />
</basic>

我不知道我必须在我的映射类中的某个地方定义使用的联接映射引用的列名属性(因为我也没有联接表本身或join-column / inverse-join-column的name属性映射到班级或班级成员.)

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

 全部为1!

解决方法:

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

标签:jpa,jpa-2-0,eclipselink,java
来源: https://codeday.me/bug/20191208/2090521.html