Hibernate ManyToMany и проблема отображения суперкласса - PullRequest
1 голос
/ 27 мая 2010

Мне нужно создать отношение в Hibernate, связав три таблицы: Survey, User и Group. Съемка может быть видна Пользователю или Группе, а Группа - это форма нескольких Пользователей.

Моя идея состояла в том, чтобы создать суперкласс для пользователя и группы и создать отношения ManyToMany между этим суперклассом и Survey.

Моя проблема в том, что Group - это не карта, а таблица, поэтому я не могу разделить поля Group между несколькими таблицами, что произойдет, если я создам общий суперкласс

Я думал о создании общего интерфейса, но сопоставление с ним не допускается. Я, вероятно, в конечном итоге выберу решение для двух отношений (Survey-User и Survey-Group), но мне не слишком нравится этот подход.

Я тоже думал о создании таблицы, которая бы выглядела так:

  Survey Id  |  ElementId  | Type

ElementId будет Group или UserId, а тип ... тип этого. Кто-нибудь знает, как этого добиться, используя спящие аннотации? Есть еще идеи?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Я вчера опубликовал очень аналогичный ответ . Подводя итог, вы не можете использовать сопоставленный суперкласс, потому что сопоставленный суперкласс не является сущностью и не может быть частью ассоциации (что вам нужно), но вы можете использовать абстрактную сущность со стратегией наследования TABLE_PER_CLASS для получить аналогичный результат.

Примерно так (не проверено):

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEntity {
    @Id @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @ManyToMany(mappedBy="entities")
    private Set<Survey> surveys = new HashSet<Survey>();
    ...

}

@Entity
public class User extends AbstractEntity {
    ...
}

@Entity
public class Group extends AbstractEntity {
    ...
}

@Entity
public class Survey {
    @Id @GeneratedValue
    private Long id;

    @ManyToMany
    private Set<AbstractEntity> entities = new HashSet<AbstractEntity>();

    ...
}

Ссылки

0 голосов
/ 27 мая 2010

Это возможно. Такой подход «унаследованных свойств» может быть достигнут путем определения суперкласса как MappedSuperclass .

EDIT:

Есть также некоторые альтернативы, перечисленные в разделе 2.2.4 справочного документа по аннотациям в спящем режиме , раздел 2.2.4.4 охватывает MappedSuperclass.

0 голосов
/ 27 мая 2010

Вы можете использовать таблицу для конкретной стратегии наследования классов, Hibernate будет реплицировать все свойства для каждого подкласса, это будет работать с представлением.

Я бы также предложил составной шаблон для пользователей / групп (который близок к вашему первому варианту).

http://en.wikipedia.org/wiki/Composite_pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...