Как использовать аннотации, связанные с 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 как ответ.
- Я хотел бы отметить, что, согласно книге ...
Ответ #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;
}
}
Ответ #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 поможет!
- Я знаю, что это примерно на 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
Ответ на вопрос: Как использовать аннотации, связанные с Hibernate @ Any?
Вы читали the Hibernate Annotations documentation for @Any? Сам еще не использовал его, но 9X_javax похоже, что это какой-то расширенный способ 9X_core-java определения ссылок. Ссылка включает пример, хотя 9X_oraclejdk я не знаю, достаточно ли этого, чтобы полностью 9X_java-api понять концепцию ...
-
21
-
10
-
1
-
2
-
8
-
3
-
2
-
1
-
8
-
4
-
5
-
1
-
3
-
2
-
2
-
5
-
4
-
3
-
2
-
3
-
9
-
7
-
5
-
7
-
1
-
5
-
2
-
3
-
2
-
2
-
3
-
1
-
4
-
5
-
4
-
4
-
1
-
1
-
5
-
2
-
2
-
2
-
1
-
6
-
10
-
8
-
5
-
26
-
9
-
6