背景描述:
两个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