原文链接: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中的方法。