我有一个包含3个键的复合键。
复合键=>
@Embeddable
public class CompositeId implements Serializable{
@Column(unique = true)
private int deliveryId;
@MapsId
@OneToOne
@JoinColumn(name = "invoiceId",unique = true)
private Invoice invoiceId;
@MapsId
@ManyToOne
@JoinColumn(name = "customerId",nullable = false)
private Customer customerId;
}
投放类=>
@Entity
public class Delivery {
@EmbeddedId
private CompositeId compositeId;
}
这是如何使用复合ID的。 deliveryId用于交付实体本身,其他密钥用于共享主键。
当我编写session.createQuery
时Query query = session.createQuery("from Delivery where compositeId.deliveryId=?");
query.setParameter(0,1);
当它运行时,会引发异常:
javax.persistence.PersistenceException:org.hibernate.HibernateException:找到了多个具有给定标识符的行:1,类:example.test.Delivery
所以我虽然重写了equals和hashcode方法
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Invoice) {
Invoice invoice = (Invoice) obj;
if (invoice.getInvoiceId() == this.invoiceId.getInvoiceId()) {
return true;
}
if (invoice.getDeliveryId() == this.invoiceId.getDeliveryId()) {
return true;
}
}
if (obj instanceof Customer) {
Customer customer = (Customer) obj;
if (customer.getCustomerId() == this.customerId.getCustomerId()) {
return true;
}
if (customer.getDeliveryId() == this.customerId.getDeliveryId()) {
return true;
}
}
return false;
}
但我仍然得到同样的错误。而且我认为它会解决它。但它没有。我通过跟踪SQL找到了原因,原因是由于双向关系,它获取了2个Customer和Item对象。那我怎么解决呢?
谢谢:)
答案 0 :(得分:0)
对于你的主要问题,HibernateException,请打开hibernate.show_sql = true,看看被触发的SQL是什么,结果又回来了。
然而,映射看起来很好,适用于相同的结构和不同的类/表名。
对于第二部分,equals方法,我建议使用Eclipse中的自动生成方法并包含所有属性。您的Invoice和Customer类还必须实现equals和hashCode方法。这里equals的实现没有用,因为hibernate不会传递Invoice和Customer的实例来与CompositeId的实例进行比较。