table单一字段参照另一个table复合主键中的一个column 可使用@JoinFormula

本文介绍在实体类间存在多对一关系且涉及复合主键的情况下,如何正确进行对象关系映射(ORM)。通过使用@JoinColumnsOrFormulas、@JoinFormula等注解,确保了即使在复合主键的场景下也能正确地建立实体间的关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景描述:

两个TABLE分别用Entity代替

class A{
    @Id
    String aId; //对应TABLE中的‘A_ID’字段,A表的主键

    String a_col1;//对应TABLE中‘A_COL1’,参照 class B中的bId2

    @ManyToOne 
    @JoinColumn(name = "A_COL1", referencedColumnName = "B_ID2")
    ......
    B b;
}


//另一个class

class B{
    @Id
    String bId1;//对应TABLE中的‘B_ID1’字段,该表复合主键的组成部分之一
    @Id
    String bId2;//对应TABLE中的‘B_ID2’字段,该表复合主键的组成部分之一
}

这里 A和B是多对一关系,即 多个A对应一个B,我在Class A上加了如下映射

 @ManyToOne 
 @JoinColumn(name = "A_COL1", referencedColumnName = "B_ID2")
 B b;

问题来了,如果在A_COL1=B_ID2的同时,B_ID1='某个常量值'(或者说B_ID1='AAAA'),

这样运行绝对报错的:not to map a single property.即B是由复合键来确定唯一的,因此只参照了一个复合键的一个部分,

肯定不能确定唯一性。

解决办法如下:

@ManyToOne

@JoinColumnsOrFormulas(value=

{@JoinColumnOrFormula(column=@JoinColumn(name="A_COL1",referencedColumnName="B_ID2")),

@JoinColumnOrFormula(formula=@JoinFormula(value="'AAA'", referencedColumnName = "COLB1")) 

})

B b;

重点就是@JoinFormula的使用(和@JoinColumn类似):

value指明定值'AAA'(这里也可以写SQL表达式),

注意:如果是定值,这里value="'A'"的写法,是双引号中加了一对单引号,再加上定值

referencedColumnName指明列的名称

由于关联关系多于一个,所以,需要使用@JoinColumnsOrFormulas、@JoinColumns、@JoinrFormulas这样的标签,将多个条件包括进来。

 

举一个具体的例子:

TABLE TEACHER:                               TABLE USER:

ID    NAME                                            USER_NAME   TYPE

1       老张                                              老张                  teacher

2       老李                                              老李                  teacher

3       老王                                              老王                  teacher

                                                              老张                  Principal

也许TABLE设计上不严格,将就看。也就是上面所说的 teacher 表 的name 参照 USER表的name。

当user的type为‘teacher’的时候,就对应了teacher表。因此,在teacher中映射时,

@JoinColumnsOrFormulas(value=

{@JoinColumnOrFormula(column=@JoinColumn(name="NAME",referencedColumnName="USER_NAME")),

@JoinColumnOrFormula(formula=@JoinFormula(value="'teacher'", referencedColumnName = "TYPE")) 

})

USER user;

                                              

参考:http://www.oschina.net/question/54953_45536

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值