前言
最好的老师是 google,不信你去试下百度
一 @Any 的使用方法
场景:假设一个车辆类,它可以是个人或者公司拥有:
@Entity
@DiscriminatorValue("PRS")
public class Person implements VehicleOwner { ... }
@Entity
@DiscriminatorValue("CPY")
public class Company implements VehicleOwner { ... }
使用@Any注解来映射关系:
@Entity
@DiscriminatorValue("VEH")
public class Vehicle {
...
@Any(
metaColumn=@Column(name="owner_type" , length=3),
fetch=FetchType.LAZY
)
@AnyMetaDef(
idType="long", metaType="string" ,
metaValues={
@MetaValue(targetEntity=Person.class, value="PRS" ),
@MetaValue(targetEntity=Company.class, value="CPY" )
}
)
@JoinColumn(name="owner_id" )
public VehicleOwner getOwner() { ... }
public void setOwner(VehicleOwner owner) { ... }
...
}
在车辆表这将产生一个二元组(owner_type,owner_id),共同确定VehicleOwner对象是Person还是Company。
二 @ManyToAny 的使用方法
场景:假设一个车辆类,它可以是多个个人或者公司拥有:
@Entity
@DiscriminatorValue("VEH")
public class Vehicle {
...
@ManyToAny(
metaColumn = @Column( name = "owner_type" )
)
@AnyMetaDef(
idType = "integer", metaType = "string",
metaValues = {
@MetaValue( targetEntity = Person.class, value="PRS" ),
@MetaValue( targetEntity = Company.class, value="CPY" )
}
)
@Cascade( { org.hibernate.annotations.CascadeType.ALL } )
@JoinTable(
name = "vehicle_owners",
joinColumns = @JoinColumn( name = "vehicle_id" ),
inverseJoinColumns = @JoinColumn( name = "owner_id" )
)
public List<Property> getOwners() { ... }
private void setOwners(List<VehicleOwner> owners) { ... }
...
}
这会生成一张vehicle_owners表(字段:vehicle_id,owner_type,owner_id)。vehicle_id识别车辆,owner_type,owner_id组合一起识别主人(无论是个人或公司)。
参考文档:http://jpaobjects.sourceforge.net/m2-site/main/documentation/docbkx/html/user-guide/ch04s09.html