Как использовать аннотации, связанные с Hibernate @ Any?

Может ли кто-нибудь объяснить мне, как аннотации 9X_jdk Any-related (@Any, @AnyMetaDef, @AnyMetaDefs и @ManyToAny) работают на практике. Мне 9X_jre сложно найти какую-либо полезную документацию 9X_annotation (сам по себе JavaDoc не очень полезен) по 9X_object-relational-mapping этому поводу.

До сих пор я понял, что они 9X_annotation каким-то образом позволяют ссылаться на 9X_orm абстрактные и расширенные классы. В таком 9X_jdk случае почему нет аннотации @OneToAny? И относится 9X_j2se ли это «любое» к одному «любому» или нескольким 9X_java «любым»?

Мы будем очень признательны за короткий, практичный 9X_.java и иллюстративный пример (не обязательно 9X_core-java компилировать).

Изменить: насколько бы я ни хотел 9X_openjdk принимать ответы как ответы и отдавать должное, я 9X_hibernate нашел ответы как Smink, так и Sakana информативными. Поскольку 9X_j2se я не могу принять несколько ответов как 9X_java ответ, я, к сожалению, не отмечу ни один из них 9X_jdk как ответ.

33
1

  • Я хотел бы отметить, что, согласно книге ...
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Как использовать аннотации, связанные с Hibernate @ Any?

Надеюсь, этот article проливает свет на эту тему:

Иногда 9X_javax нам нужно сопоставить ассоциация собственности 9X_orm с разными типы сущностей, у которых нет общий 9X_annotation предок - так что простой полиморфная ассоциация 9X_hibernate не делает работа.

Например, предположим, что 9X_object-relational-mapping три разных приложения управляют медиа-библиотекой: первое 9X_javax приложение управляет заимствованием книг, второе 9X_annotation - DVD-дисками, а третье - VHS. Между приложениями 9X_object-relational-mapping нет ничего общего. Теперь мы хотим разработать 9X_oraclejdk новое приложение, которое управляет всеми 9X_java тремя типами носителей и повторно использует 9X_oraclejdk существующие объекты Book, DVD и VHS. Поскольку 9X_openjdk классы Book, DVD и VHS были получены из 9X_j2se разных приложений, у них нет никакого предка 9X_jre - общим предком является java.lang.Object. Тем 9X_oraclejdk не менее, мы хотели бы иметь одну сущность 9X_jre "Заимствование", которая могла 9X_openjdk бы ссылаться на любой из возможных типов 9X_core-java мультимедиа.

Чтобы решить этот тип ссылок, мы 9X_java можем использовать сопоставление any. это 9X_openjdk сопоставление всегда включает более одного 9X_javax столбца: один столбец включает тип объекта, на 9X_j2se который ссылается текущее сопоставленное 9X_orm свойство, а другой включает идентификатор 9X_java-libraries объекта, например, если мы ссылаемся на 9X_jdk книгу, первый столбец будет включать маркер 9X_java-libraries для тип сущности "Книга", а второй 9X_oraclejdk будет включать идентификатор конкретной 9X_java книги.

@Entity @Table(name = "BORROW") public class Borrow{ @Id @GeneratedValue private Long id; @Any(metaColumn = @Column(name = "ITEM_TYPE")) @AnyMetaDef(idType = "long", metaType = "string", metaValues = { @MetaValue(targetEntity = Book.class, value = "B"), @MetaValue(targetEntity = VHS.class, value = "V"), @MetaValue(targetEntity = DVD.class, value = "D") }) @JoinColumn(name="ITEM_ID") private Object item; ....... public Object getItem() { return item; } public void setItem(Object item) { this.item = item; } } 

30
0

Ответ #2

Ответ на вопрос: Как использовать аннотации, связанные с Hibernate @ Any?

Аннотация @ Any определяет полиморфную ассоциацию 9X_jre с классами из нескольких таблиц. Этот тип 9X_openjdk отображения всегда требует более одного 9X_annotations столбца. Первый столбец содержит тип связанной 9X_annotations сущности. Остальные столбцы содержат идентификатор. Невозможно 9X_oraclejdk указать ограничение внешнего ключа для такого 9X_annotations рода ассоциации, поэтому это определенно 9X_annotations не подразумевается как обычный способ отображения 9X_annotations (полиморфных) ассоциаций. Вы должны использовать 9X_jre это только в очень особых случаях (например, журналы 9X_openjdk аудита, данные сеанса пользователя и т. д.). Аннотация 9X_jdk @Any описывает столбец, содержащий информацию 9X_java-api о метаданных. Чтобы связать значение метаданные 9X_java-se и фактический тип объекта, используются 9X_jre аннотации @AnyDef и @AnyDefs.

@Any( metaColumn = @Column( name = "property_type" ), fetch=FetchType.EAGER ) @AnyMetaDef( idType = "integer", metaType = "string", metaValues = { @MetaValue( value = "S", targetEntity = StringProperty.class ), @MetaValue( value = "I", targetEntity = IntegerProperty.class ) } ) @JoinColumn( name = "property_id" ) public Property getMainProperty() { return mainProperty; } 

idType представляет 9X_j2se тип свойства идентификатора целевых сущностей, а 9X_jdk metaType - тип метаданных (обычно String). Обратите 9X_openjdk внимание, что @AnyDef можно объединять и 9X_object-relational-mapping использовать повторно. Рекомендуется разместить 9X_annotation его как метаданные пакета в этом чехол.

//on a package @AnyMetaDef( name="property" idType = "integer", metaType = "string", metaValues = { @MetaValue( value = "S", targetEntity = StringProperty.class ), @MetaValue( value = "I", targetEntity = IntegerProperty.class ) } ) package org.hibernate.test.annotations.any; //in a class @Any( metaDef="property", metaColumn = @Column( name = "property_type" ), fetch=FetchType.EAGER ) @JoinColumn( name = "property_id" ) public Property getMainProperty() { return mainProperty; } 

@ManyToAny 9X_j2se допускает полиморфные ассоциации с классами 9X_object-relational-mapping из нескольких таблиц. Этот тип сопоставления 9X_oraclejdk всегда требует более одного столбца. Первый 9X_java столбец содержит тип связанной сущности. Остальные 9X_j2se столбцы удерживайте идентификатор. Невозможно 9X_orm указать ограничение внешнего ключа для такого 9X_java-libraries рода ассоциации, поэтому это наиболее конечно 9X_core-java не подразумевается как обычный способ отображения 9X_java-api (полиморфных) ассоциаций. Вы должны использовать 9X_jdk это только в очень особые случаи (например, журналы 9X_java-libraries аудита, данные сеанса пользователя и т. д.).

@ManyToAny( metaColumn = @Column( name = "property_type" ) ) @AnyMetaDef( idType = "integer", metaType = "string", metaValues = { @MetaValue( value = "S", targetEntity = StringProperty.class ), @MetaValue( value = "I", targetEntity = IntegerProperty.class ) } ) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable( name = "obj_properties", joinColumns = @JoinColumn( name = "obj_id" ), inverseJoinColumns = @JoinColumn( name = "property_id" ) ) public List getGeneralProperties() { 

Источник: Hibernate Annotations Reference Guide 3.4.0GA

Надеюсь, это 9X_jdk поможет!

24
2

  • Я знаю, что это примерно на 6 лет позже, но этот последний бит @ManyToAny спас мою задницу. Я нигде не видел, чтобы это упом ...

Ответ #3

Ответ на вопрос: Как использовать аннотации, связанные с Hibernate @ Any?

Аннотации @Any определяют полиморфную ассоциацию 9X_oraclejdk с классами из нескольких таблиц, верно, но 9X_javax полиморфные ассоциации, подобные этим, являются 9X_java антипаттерном SQL! Основная причина в том, что 9X_object-relational-mapping вы не можете определить ограничение FK, если 9X_orm столбец может ссылаться на более чем одну 9X_annotation таблицу.

Одно из решений, указанное Биллом 9X_core-java Карвином в своей книге, заключается в создании 9X_object-relational-mapping таблиц пересечений для каждого типа «Любой» вместо 9X_java-libraries использования одного столбца с «типом» и 9X_java-se использования модификатора unique, чтобы 9X_.java избежать дублирования. Это решение может 9X_java быть болезненным при работе с JPA.

Другое 9X_java решение, также предложенное Карвином, - создать 9X_javax супертип для связанных элементов. Взяв пример 9X_jre заимствования книги, DVD или VHS, вы можете 9X_object-relational-mapping создать элемент супертипа и сделать так, чтобы 9X_annotation книги, DVD и VHS унаследовали от элемента 9X_core-java со стратегией объединенной таблицы. Затем 9X_openjdk заимствовать указывает на Предмет. Таким 9X_java-api образом вы полностью избежите проблемы FK. Я 9X_orm перевел пример книги на JPA ниже:

@Entity @Table(name = "BORROW") public class Borrow{ //... id, ... @ManyToOne Item item; //... } @Entity @Table(name = "ITEMS") @Inheritance(strategy=JOINED) public class Item{ // id, .... // you can add a reverse OneToMany here to borrow. } @Entity @Table(name = "BOOKS") public class Book extends Item { // book attributes } @Entity @Table(name = "VHS") public class VHS extends Item { // VHSattributes } @Entity @Table(name = "DVD") public class DVD extends Item { // DVD attributes } 

4
0

Ответ #4

Ответ на вопрос: Как использовать аннотации, связанные с Hibernate @ Any?

Вы читали the Hibernate Annotations documentation for @Any? Сам еще не использовал его, но 9X_javax похоже, что это какой-то расширенный способ 9X_core-java определения ссылок. Ссылка включает пример, хотя 9X_oraclejdk я не знаю, достаточно ли этого, чтобы полностью 9X_java-api понять концепцию ...

2
0