Hibernate: получить родительский элемент для объекта OneToMany-Child без двунаправленной связи - PullRequest
3 голосов
/ 20 января 2012

как я могу проверить, есть ли у сущности родительская сущность, которая сопоставляет эту сущность с аннотацией @ OneToMany .Отображение является однонаправленным, определенным для родительского

@Entity
public class ParentEntity {

    ...

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

    ...

Hibernate автоматически создает таблицу сопоставления или, если используется @ JoinColumn столбец с идентификатором родителя в дочерней таблице.Когда ребенок сохраняется, hibernate добавляет соответствующий родительский идентификатор в таблицу db.

Я не хочу определять двунаправленное отношение, так как мне не нужна эта «особенность» в моей логике приложения, и естьуже загружены объекты, которые должны быть изменены.Мне просто нужен родитель для вопросов репликации.Это означает, что мне нужно экспортировать некоторые данные в другую схему БД (имеет другую структуру таблиц).

Я использую перехватчик для запуска действия репликации в "onSave" методе, определенном Интерфейс перехватчика .Если родитель получает нового дочернего элемента, существует только постоянное действие запускающего дочернего элемента.Я не знаю родителя, которому он принадлежит.

Я действительно ценю любую помощь!

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 января 2012
int count = session.createCriteria(Parent.class)
    .createCriteria("childEntities")
    .add(Restrictions.eq(childIdInQuestion))
    .setProjetction(Projections.rowCount())
    .uniqueResult();

Boolean hasParent = count > 0;
0 голосов
/ 26 января 2012

Я нашел ответ на проблему без использования запросов.

Интерфейс Interceptor в Hibernate определяет три метода для коллекций.

Если коллекция на объекте (в данном случае 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 на таблицы в целевой системе.В этой конфигурации определен класс java-компонентов.

...