@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 表示目标实体标识符属性类型,metaType 表示元数据类型(通常是 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 Annotations 参考指南 3.4.0GA
希望能帮助到你!