原文链接:http://stackoverflow.com/questions/217831/how-to-use-hibernate-any-related-annotations
1:业务场景:有时我们需要映射关联属性不同类型的实体,这个时候@ManyToAny 或者 @Any就可以解决该业务场景问题。
2:直接上业务实例。
用户信息(User)、出借信息(BorrowInfo)、出借类别书本(Book)、出借类别DVD(DVD)、出借类别VHS(VHS)。
3:
(1)省去用户信息
(2)出借类别书本(Book)实体模型
@Entity @Table(name = "T_BOOK") public class Book { @Column(name="ID") private String id ; @Column(name="NAME") private String name; @Column(name="ITEM_TYPE") private String itemType; ----省去Get Set方法 }
(3)出借类别DVD实体模型
@Entity @Table(name = "T_DVD") public class DVD { @Column(name="ID") private String id ; @Column(name="NAME") private String name; @Column(name="ITEM_TYPE") private String itemType; }
(4)出借类别VHS实体模型
@Entity @Table(name = "T_VHS") public class VHS { @Column(name="ID") private String id ; @Column(name="NAME") private String name; @Column(name="ITEM_TYPE") private String itemType; }
(5)出借信息BorrowInfo实体模型设计
@Entity @Table(name="BORROW") public class BorrowInfo { @Column(name="ID") private String id; @JoinColumn(name="USER_ID") private User user; @Any(metaColumn = @Column(name = "ITEM_TYPE")) @AnyMetaDef(idType = "string", 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 itemObj; }
补充:有些业务场景需要用到@ManyToAny,可以参见stackoverflow中的方法。