Как использовать аннотации, связанные с 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