java - springmvc - spring入门




如何使用Hibernate @ Any-related注释? (3)

@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

希望能帮助到你!

有人可以向我解释任何相关的注释( @AnyMetaDef@AnyMetaDefs @AnyMetaDef@AnyMetaDefs@ManyToAny )如何在实践中发挥作用。 我很难找到任何有用的文档(仅JavaDoc并不是很有帮助)。

到目前为止,我已经收集到它们以某种方式启用对抽象和扩展类的引用。 如果是这种情况,为什么没有@OneToAny注释? 这个“任何”指的是单个“任何”或多个“任何”吗?

一个简短,实用和说明的例子将非常受欢迎(不必编译)。

编辑:尽管我希望接受回复作为答案并给予应有的信用,但我发现Smink和Sakana的答案都提供了丰富的信息。 因为我不能接受几个回复作为答案 ,遗憾的是我不会将其作为答案。


@Any注释定义了来自多个表的类的多态关联,对,但这些多态关联是SQL反模式! 主要原因是如果列可以引用多个表,则无法定义FK约束。

Bill Karwin在他的书中指出的解决方案之一是为每种类型的“Any”创建交集表,而不是使用一个具有“type”的列,并使用unique修饰符来避免重复。 这个解决方案可能是与JPA一起工作的痛苦。

Karwin提出的另一种解决方案是为连接元素创建超类型。 借用Book,DVD或VHS的例子,您可以创建一个超类型的项目,并使用连接表的策略使Book,DVD和VHS继承自Item。 然后借用指向物品。 这样你就完全避免了FK问题。 我将这本书的例子翻译成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
}

您是否阅读过@Any的Hibernate Annotations文档 ? 我自己还没有使用过那个,但它看起来像是一些定义引用的扩展方式。 该链接包含一个例子,但我不知道它是否足以完全理解这个概念......





annotations