@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: 休眠注释参考指南 3.4.0GA
希望它有帮助!