【问题标题】:One to many join joining to same record twice一对多加入两次加入同一记录
【发布时间】:2013-10-14 19:14:50
【问题描述】:

我正在尝试加入这个表:

@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

}

我在数据库中有 2 个BATCH_DELIVERY 对象对应 1 个BATCH,所以当 Hibernate 查询数据库时,我希望这两个 BATCH_DELIVERY 对象都在 BATCHbatchDeliveryList 中。

但是,我得到的是BATCHbatchDeliveryList 中的2 个相同 BATCH_DELIVERY 对象。为什么 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 对象。

【问题讨论】:

  • 能否请您粘贴每个班级的其余代码?另外,你是否为每个类实现了equals和hashCode?​​span>
  • 每个类的其余代码只是更多的数据成员和相应的getter/setter。不,我还没有实现 equals 和 hashCode。除非实施,否则联接是否不起作用?我不是 Hibernate 专家。
  • 嗯,这取决于实体是如何加载的。因为您还没有实现 hashCode 或 equals hibernate 可能会认为它没有从数据库中加载实体并重新加载它们。在使用 Collections 时始终实现 hashCode 和 equals 是一个很好的建议。请参阅community.jboss.org/wiki/EqualsAndHashCode 了解更多详情。
  • 谢谢。我通读了一遍。同时我也找到了一篇类似的文章并实现了hashCode和equals,但我仍然有同样的问题。我测试了equals可以正常工作......
  • 你能贴出你用来加载实体的代码吗?

标签: java hibernate jpa jpa-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2021-06-16
    相关资源
    最近更新 更多