同时使用@IdClass @ManyToOne碰到的一个问题
程序员文章站
2022-04-12 20:29:07
...
因为开发需要,一个实体类需要使用联合主键,而这两个主键又通过ManyToOne与另外两个实体关联。
按照百度的方法使用@IdClass,同时建立了复合主键类。
实体类如下:
@Entity
@Table(name = "mytable")
@IdClass(testPK.class)
public class myentity{
@Id
@ManyToOne
@JoinColumn(name = "id1")
private Object object1;
public Object getObject1() {
return object1;
}
public void setObject(Object object1) {
this.object1 = object1;
}
@Id
@ManyToOne
@JoinColumn(name = "id2")
private Object object2;
public Object getObject2() {
return object2;
}
public void setObject(Object object2) {
this.object2 = object2;
}
}
复合主键类如下:
public class testPK implements Serializable{
private Object object1;
public Object getObject1() {
return object1;
}
private Object object2;
public Object getObject2() {
return object2;
}
@Override
public boolean equals(Object obj) {
...
}
@Override
public int hashCode() {
...
}
}
项目运行之后,保存myentity实体的时候总是报错,大概的意思是无法把Integer(Object的主键)类型转换成Object类型。
经过反复尝试之后,终于找到解决办法,那就是在联合主键类里面定义的变量不能是实体,而必须是实体的主键,但是这些变量的名字又必须与实体类里面引用的实体名称相同。
最后成功的联合主键类定义如下:
public class testPK implements Serializable{
private Integer object1;//此处用Integer是因为object1的主键为Integer类型,如object1的主键为String型此处就是用String
public Integer getObject1() {
return object1;
}
private Integer object2;//此处用Integer是因为object2的主键为Integer类型,如object2的主键为String型此处就是用String
public Integer getObject2() {
return object2;
}
@Override
public boolean equals(Object obj) {
...
}
@Override
public int hashCode() {
...
}
}
网上关于同时使用@IdClass 与 @ManyToOne的资料甚少,在此标记一下。