欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

同时使用@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的资料甚少,在此标记一下。