有人可以向我解释与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;
    }

}

09-05 18:50