[3rd][2011-1] foreign key must have same number of columns

最近一周在做一些查询的优化,看着一两年前写的东西就在抱怨 为什么原先不这么这么写......

好吧,谁让你一开始就没定下所谓的业务呢......

其实优化工作很简单,去除无用的表连接,不过因为整个查询是由criteria构建,所以你的VO关系决定了你的criteria path是不是最优的。

原来的逻辑是A -> AB -> B -> C

由于B是一张KW级别的表,加上C有B字段

所以就改成 A-> AB -> C,

在AB中建个关联 到 C

如下:

class A{
.......
}
class B{
......
}
class AB{
private A a;
private B b;
private Set<C> c = new HashSet<C>(0);

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID")
public Set<C> getC(){
return c;
}
}
class C{
private B b
}


不过很可惜,因为AB 中已经有个以B_ID 为外键关联到B了,而AB是复合主键,所以在写上述的mapping时候会报

foreign key must have same number of columns as the referenced primary key.

它把复合主键给你和B_id给mapping 上了,真够傻X的,难道就不能关联单个么。

好吧,改成


class AB{
private A a;
private B b;
private Set<C> c = new HashSet<C>(0);

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID",referencedColumnName="B_ID")
public Set<C> getC(){
return c;
}
}



就OK了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值