Аннотация @Any определяет полиморфную ассоциацию с классами из нескольких таблиц. Этот тип картирования
всегда требуется более одного столбца. Первый столбец содержит тип связанного объекта. Остальные
столбцы содержат идентификатор. Невозможно указать ограничение внешнего ключа для этого вида связи, поэтому
это, безусловно, не подразумевается как обычный способ отображения (полиморфных) ассоциаций. Вы должны использовать это
только в очень особых случаях (например, журналы аудита, данные сеанса пользователя и т. д.).
Аннотация @Any описывает столбец, содержащий информацию метаданных. Чтобы связать значение
метаданные и фактический тип сущности, используются аннотации @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 представляет тип свойства идентификатора целевых объектов, а мета-тип - тип метаданных (обычно String).
Обратите внимание, что @AnyDef может быть взаимоусиливаемым и использоваться повторно. Рекомендуется размещать его как метаданные пакета в этом
случай.
//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 разрешает полиморфные ассоциации для классов из нескольких таблиц. Этот тип отображения всегда требует
более одного столбца. Первый столбец содержит тип связанного объекта. Остальные столбцы
держать идентификатор. Невозможно указать ограничение внешнего ключа для такого рода ассоциации, так что это наиболее
конечно, не подразумевается как обычный способ картирования (полиморфных) ассоциаций. Вы должны использовать это только в очень
особые случаи (например, журналы аудита, данные сеанса пользователя и т. д.).
@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<Property> getGeneralProperties() {
Src: Справочное руководство по Hibernate 3.4.0GA
Надеюсь, это поможет!