【发布时间】: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 表中的主键是ID。 BATCH_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 对象都在 BATCH 的 batchDeliveryList 中。
但是,我得到的是BATCH 的batchDeliveryList 中的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