有人可以向我解释与Any相关的注释(@Any
,@AnyMetaDef
,@AnyMetaDefs
和@ManyToAny
)在实践中如何工作。我很难找到关于这些的任何有用文档(仅JavaDoc并不是很有帮助)。
到目前为止,我已经收集到它们可以以某种方式启用对抽象类和扩展类的引用。如果是这种情况,为什么没有@OneToAny
注释?这个“任何”是指单个“任何”还是多个“任何”?
我们将不胜感激地提供一个简短,实用和说明性的示例(不必编译)。
编辑:尽可能多地接受答复作为答案,并在适当的时候给予好评,我发现Smink和Sakana的答案都提供了信息。由于我无法接受多条答复作为答案,因此很遗憾,我都不会将这两项都标记为答案。
最佳答案
希望这个article给这个主题带来一些启发:
例如,假设管理媒体库的三个不同的应用程序-第一个应用程序管理图书借阅,第二个应用程序管理DVD,第三个VHS。这些应用程序没有共同之处。现在,我们要开发一个新的应用程序,该应用程序可以管理所有三种媒体类型并重用现有的Book,DVD和VHS实体。由于Book,DVD和VHS类来自不同的应用程序,因此它们没有任何祖先实体-共同的祖先是java.lang.Object。我们仍然希望有一个借用实体,它可以引用任何可能的媒体类型。
为了解决这种类型的引用,我们可以使用任何映射。此映射始终包括不止一列:一列包括当前映射属性所引用的实体的类型,另一列包括实体的标识,例如,如果我们引用的是本书,则第一列将包含用于图书实体类型,第二个实体类型将包含特定图书的ID。
@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;
}
}