Hibernate在会话期间不更新ManyToMany关联

时间:2014-04-10 01:09:48

标签: java hibernate postgresql

我正在使用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)。这太令人困惑了。

1 个答案:

答案 0 :(得分:2)

你没有选择。必须有一个所有者方面,必须有一个反面。维护协会的双方都是你的责任:当你只添加A到B时,不要指望在A的B集合中有B(反之亦然)

现在,没有任何内容禁止您在A中添加addB(B b)方法,将b添加到A的B集合中,this添加到B的集合中作为。当然,您也可以在B中使用方法addA(A a)执行相同的操作。