同时使用@IdClass @ManyToOne碰到的一个问题

因为开发需要,一个实体类需要使用联合主键,而这两个主键又通过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的资料甚少,在此标记一下。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值