在前面已经读到过嵌入对象这一概念(@Embeddable),而复合主键只不过是嵌入对象的特例而已,简单例子:
Customer类的主键有id和name两个属性决定,我们写一个自定义的复合主键类CustomerPK:
@Embeddable
public class CustomerPK implements java.io.Serializable
{
private long id;
private String name;
public CustomerPK()
{
}
public CustomerPK(long id, String name)
{
this.id = id;
this.name = name;
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int hashCode()
{
return (int) id + name.hashCode();
}
public boolean equals(Object obj)
{
if (obj == this) return true;
if (!(obj instanceof CustomerPK)) return false;
if (obj == null) return false;
CustomerPK pk = (CustomerPK) obj;
return pk.id == id && pk.name.equals(name);
}
}
复合主键需要实现equals和hashCode方法,通过这两个方法来实现主键约束条件,而使用就更简单了:@Entity
public class Customer implements java.io.Serializable
{
CustomerPK pk;
public Customer()
{
}
@EmbeddedId
public CustomerPK getPk()
{
return pk;
}
public void setPk(CustomerPK pk)
{
this.pk = pk;
}
.........现在的问题是,复合主键如何做关系映射?以many-to-many为例:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER, mappedBy="customers")
@JoinTable(name="flight_customer_table",
joinColumns = {@JoinColumn(name = "FLIGHT_ID")},
inverseJoinColumns = {@JoinColumn(name = "CUSTOMER_ID"), @JoinColumn(name = "CUSTOMER_NAME")})
public Set<Flight> getFlights()
{
return flights;
}
Customer与Flight多对多关系,上面的代码是在Customer中配置,在Flight配置如下: @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER, mappedBy="customers")
@JoinTable(name="flight_customer_table",
joinColumns={@JoinColumn(name = "FLIGHT_ID")},
inverseJoinColumns={@JoinColumn(name = "CUSTOMER_ID"), @JoinColumn(name = "CUSTOMER_NAME")})
public Set<Flight> getFlights()
{
return flights;
}
设置@JoinTable中的inverseJoinColumns为复合主键即可
![]() |
谢亚龙逼女足姑娘作检讨(图)
“安静”为啥成裁判口头语?
姚明私下发给刘翔的短信
|
![]() |
曝光:姚明小时候与可爱女生合影(图) 组图:隋菲菲私家相册 率性美感领衔女篮 |
![]() |
![]() |
![]() |


档案
日志
相册
视频








评论
想第一时间抢沙发么?