这种hibernate的一对多复合主键如何解决?

最近要解决一个遗留下来的系统,

里面有一个2个表 A,B A对B是一对多的关系

A:

ID
name

B:

ID
name
A_ID

B里面由 ID和A_ID共同决定一条唯一的记录,然后我把B里面的ID和A_ID 新建了一个B_PK.class,作为B的主键

然后B.java 如下

[code="java"]public class B {
private B_PK b_pk;
private A a;

。。。。

@ManyToOne
@JoinColumn(name="a_id")
public A getA() {
  return a;
}

}[/code]

但是这样定义的时候报错Repeated column in mapping for entity。。。

请问,类似于这样的问题,如何解决才好? 我觉得我解决的思路好像有问题
[b]问题补充:[/b]
最近要解决一个遗留下来的系统,

里面有一个2个表 A,B A对B是一对多的关系

A:

ID
name

B:

ID
name
A_ID

B里面由 ID和A_ID共同决定一条唯一的记录,然后我把B里面的ID和A_ID 新建了一个B_PK.class,作为B的主键

然后B.java 如下

public class B {
  private B_PK b_pk;
  private A a;

  。。。。

    @ManyToOne
    @JoinColumn(name="a_id")
    public A getA() {
      return a;
    }
}

但是这样定义的时候报错Repeated column in mapping for entity。。。

请问,类似于这样的问题,如何解决才好? 我觉得我解决的思路好像有问题


谢谢jones,我不用B_PK.class这个主键了,仿照
[code="java"]@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="CUST_ID",referencedColumnName="ID"),
@PrimaryKeyJoinColumn(name="CUST_TYPE",referencedColumnName="TYPE")
})
public class ValuedCustomer extends Customer {
...
}[/code]

但是报错说:Caused by: org.hibernate.AnnotationException: No identifier specified for entity:

怎么会这样?我应该如何做?
[b]问题补充:[/b]
[color=red]---------- 谢谢 jones ,继续补充---------------[/color]

对于一般的复合主键,以上的答案早就解决问题了,但是现在报错:

Unable to find properties (a_id) in entity annotated with @IdClass:B_PK

因为复合主键的其中一个字段是多对一关联到A的
@JoinColumn(name="a_id") ,所以报了这个错,这里又不知道怎么处理了。

还请jones帮忙看一下
[b]问题补充:[/b]
搞定了,不是有没有什么副作用

@IdClass(B_PK.class)
@Entity
public class B {
private int ID;
private A a;
private int a_id;

@Id
public int getID(){
return ID;
}

@Id
public int getA_Id(){
return a_id;
}

。。。。

@ManyToOne
@JoinColumn(name="a_id")
public A getA() {
return a;
}
}

也就是在B里面增加一个a_id,

这样子就可以了,反正运行起来了,不知道是否合理

4个回答

看看这个吧,你的B上必须用
[code="java"] @IdClass(B_PK.class) [/code]
声明你的B使用B_PK.class这个符合主键

另外,可以参考这个:
[url]http://melin.iteye.com/blog/197217[/url]

使用
[code="java"]@PrimaryKeyJoinColumns[/code]

[quote]PrimaryKeyJoinColumns[/quote]
用这个就是需要你的复合主键的,仔细看看这个Annotation的说明
[url]http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#PrimaryKeyJoinColumns[/url]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问