我正在使用Hibernate 4.3.4访问Postgres数据库。我们有两个实体通过ManyToMany Association链接。
代码和关联当前有效,因为在EntityA的集合中添加EntityB会在提交Session后自动将EntityA添加到EntityB的集合中。但是,我遇到的问题是,当我尝试处理EntityB的EntityAs时,它应该包含我刚刚创建的EntityA,EntityA不在该集合中(它是空的)。示例代码在这里:
@Entity
@Table(name = "entity_a")
public class EntityA {
private Set<EntityB> entityBs = new HashSet<EntityB>(0);
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "entitya_entityb",
joinColumns = { @JoinColumn(name = "entitya_id") },
inverseJoinColumns = { @JoinColumn(name = "entityb_id") })
public Set<EntityB> getEntityBs()
{
return entityBs;
}
public void setEntityBs(Set<EntityB> entityBs)
{
this.entityBs = entityBs;
}
}
@Entity
@Table(name = "entity_b")
public class EntityB {
private Set<EntityA> entityAs = new HashSet<EntityA>(0);
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "entitya_entityb",
joinColumns = { @JoinColumn(name = "entityb_id") },
inverseJoinColumns = { @JoinColumn(name = "entitya_id") })
public Set<EntityA> getEntityAs()
{
return entityAs;
}
public void setEntityAs(Set<EntityA> entityAs)
{
this.entityAs = entityAs;
}
}
/**
* HTTP REST Resource to create Entities and persist them. We do some basic logic when we create them to show the problem.
*/
@Path("/battleRhythm")
@Singleton
public class HttpResource
{
@POST
@Consumes("application/json")
public void createEntityA() {
Session hibernateSession = SessionFactory.getCurrentSession(); // SessionFactory specifics not included
hibernateSession.getTransaction().begin();
// Add an EntityB to the new EntityA
EntityA entityA0 = new EntityA();
EntityB entityB0 = new EntityB0();
entityA.getEntityBs().add(entityB0);
// Persist the new EntityA
EntityADao.getInstance().save(entityA0);
// Try to get this EntityA from EntityB
Set<EntityA> associatedEntityAs = entityB0.getEntityAs(); // Doesn't contain any EntityAs!
hibernateSession.getTransaction().commit();
}
}
以下是问题:
我可以让Hibernate在保存EntityA0时自动将EntityA0添加到EntityB0的集合中,而无需提交事务吗?这可能吗?怎么样?的
警告:上面的示例并未完全反映这一点,但我们对两个实体执行类似的操作,因此拥有一个&#34;所有者&#34;在传统的Hibernate意义上(使用mappedBy =&#34;&#34;属性配置)不是一个理想的选择。我不想试图说服每个人只在CreateEntityA()中使用EntityB.getEntityAs()。add(EntityB0)。这太令人困惑了。
答案 0 :(得分:2)
你没有选择。必须有一个所有者方面,必须有一个反面。维护协会的双方都是你的责任:当你只添加A到B时,不要指望在A的B集合中有B(反之亦然)
现在,没有任何内容禁止您在A中添加addB(B b)
方法,将b
添加到A的B集合中,和将this
添加到B的集合中作为。当然,您也可以在B中使用方法addA(A a)
执行相同的操作。