在hibernate中从session.createQuery获取多个对象

时间:2018-05-17 01:56:52

标签: java hibernate jpa

我有一个包含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对象。那我怎么解决呢?

谢谢:)

1 个答案:

答案 0 :(得分:0)

对于你的主要问题,HibernateException,请打开hibernate.show_sql = true,看看被触发的SQL是什么,结果又回来了。

然而,映射看起来很好,适用于相同的结构和不同的类/表名。

对于第二部分,equals方法,我建议使用Eclipse中的自动生成方法并包含所有属性。您的Invoice和Customer类还必须实现equals和hashCode方法。这里equals的实现没有用,因为hibernate不会传递Invoice和Customer的实例来与CompositeId的实例进行比较。