Hibernate:为没有双向关系的OneToMany-Child实体获取父级

时间:2012-01-20 14:40:46

标签: hibernate parent parent-child

如何检查实体是否有一个父实体,该实体将此实体映射到 @OneToMany 注释。 映射是在父

上定义的单向
@Entity
public class ParentEntity {

    ...

    @OneToMany(cascade=CascadeType.ALL)
    private Collection<ChildEntity> childEntities;

    ...

Hibernate自动创建一个映射表,或者如果 @JoinColumn 使用子表中具有parent-id的列。 当子进程持久化时,hibernate会将相应的父ID添加到db-table。

我不想定义双向关系,因为我在我的应用程序逻辑中不需要这个“功能”,并且已经有大量需要更改的实体。我只需要父母来解决复制问题。这意味着我必须将一些数据导出到另一个数据库模式(具有不同的表结构)。

我使用拦截器来触发拦截器接口定义的“onSave”方法中的复制操作。如果父母得到一个新的孩子,那么只有孩​​子触发的持续动作。我不知道它所属的父母。

我真的很感激任何帮助!

谢谢!

2 个答案:

答案 0 :(得分:3)

int count = session.createCriteria(Parent.class)
    .createCriteria("childEntities")
    .add(Restrictions.eq(childIdInQuestion))
    .setProjetction(Projections.rowCount())
    .uniqueResult();

Boolean hasParent = count > 0;

答案 1 :(得分:0)

我在不使用查询的情况下找到了问题的答案。

Hibernate的Interceptor接口定义了三个有关集合的方法。

如果实体上的集合(本例中为ParentEntity)被更改,则会调用以下三种方法之一:

public void onCollectionRecreate(Object collection, Serializable key)
        throws CallbackException {
}


public void onCollectionRemove(Object collection, Serializable key)
        throws CallbackException {
}

public void onCollectionUpdate(Object collection, Serializable key)
        throws CallbackException {
}

对象“集合”的类型为 PersistenceBag ,可以从中读取“所有者”。在这种情况下,这将是父母。另一个提示:方法的第二个参数是“所有者”的休眠键。为了我的目的,我有一个配置文件,它将Hibernate实体映射到目标系统上的表。在此配置中,定义了parnent java类。