一对多加入加入同一记录两次

时间:2013-10-14 19:14:50

标签: java hibernate jpa jpa-2.0

我正在尝试加入此表:

@Entity
@Table(name = "BATCH")
public class Batch {

    @Id
    private int id;

    @OneToMany
    @JoinColumn(name="BATCH_ID")
    private List<BatchDelivery> batchDeliveryList;

    public List<BatchDelivery> getBatchDeliveryList() {
        return batchDeliveryList;
    }

    public void setBatchDeliveryList(
        List<BatchDelivery> batchDeliveryList) {
        this.batchDeliveryList = batchDeliveryList;
    }

到下表。 BATCH表中的主键是IDBATCH_DELIVERY表中BATCH表中的外键为BATCH_ID

@Entity
@Table(name="BATCH_DELIVERY")
public class BatchDelivery {

    @Id
    @Column(name = "BATCH_ID")
    private int batchId;

    // Other fields, get/set here

}

我在数据库中有1 BATCH_DELIVERYBATCH个对象,所以当Hibernate查询数据库时,我希望BATCH_DELIVERY个对象都在BATCH' s batchDeliveryList

但是,我得到的是BATCH_DELIVERY BATCH中的2个相同的 batchDeliveryList个对象。为什么Hibernate看到2个对象匹配,但返回相同的两个?

修改 我用来加载实体的代码:

@Test
public void thatCourtCallsBatchDeliveryJoinWorks() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Batch batch = null;
    int id = 555;

    try {
        batch = (Batch)session.get(Batch.class, id);            
        Hibernate.initialize(Batch.getBatchDeliveryList());
    } catch (Exception e) {
        logger.error("thatBatchDeliveryJoinWorks Exception", e);
    } finally {
        session.close();
    }
}

注意:我知道在这个测试中没有断言。当我调试它并检查Batch对象所持有的List时,我看到BatchDelivery个对象是相同的。如果我使用Set而不是List,那么只会添加1个BatchDelivery对象。

1 个答案:

答案 0 :(得分:0)

问题是BatchDelivery没有主键,因此加入其非唯一ID会产生意外结果。我将BatchDelivery中的第二个字段注释为@Id以创建复合键。