[英]Using a composite key in a many-to-many relationship in JPA
我有以下情況:
Set<Permission>
) 問題是:在這種情況下,我如何使Permission實體成為自身的復合鍵? 在這種多對多關系的背景下,我特別感興趣。
有任何想法嗎?
1ºApermission對象有三個字段
2º權限上限的三個字段組成復合鍵
屬性和復合主鍵共享相同的列
所以你的問題看起來像這個
@Entity
public class Permission {
private PermissionId permissionId;
private Integer field1;
private Integer field2;
private Integer field3;
// required no-arg constructor
public Permission() {}
public Permission(Integer field1, Integer field2, Integer field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
setPermissionId(new PermissonId(Integer field1, Integer field2, Integer field3));
}
@EmbeddedId
public PermissionId getPermissionId() {
return this.permissionId;
}
@Column(name="FIELD_1", insertable=false, updatable=false)
public Integer getField1() {
return this.field1;
}
@Column(name="FIELD_2", insertable=false, updatable=false)
public Integer getField2() {
return this.field2;
}
@Column(name="FIELD_3", insertable=false, updatable=false)
public Integer getField3() {
return this.field3;
}
@Embeddable
public static class PermissionId implements Serializable {
private Integer field1;
private Integer field2;
private Integer field3;
// required no-arg constructor
public PermissionId() {}
public PermissionId(Integer field1, Integer field2, Integer field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Column(name="FIELD_1", nullable=false)
public Integer getField1() {
return this.field1;
}
@Column(name="FIELD_2", nullable=false)
public Integer getField2() {
return this.field2;
}
@Column(name="FIELD_3", nullable=false)
public Integer getField3() {
return this.field3;
}
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof PermissionId))
return false;
final PermissionId other = (PermissionId) o;
if(!(getField1().equals(other.getField1())))
return false;
if(!(getField2().equals(other.getField2())))
return false;
if(!(getField3().equals(other.getField3())))
return false;
return true;
}
// requered hashcode impl
public int hashcode() {
// code goes here
}
}
}
但是別忘記了
由於多個屬性共享同一列 ,因此必須將其中一個定義為insertable = false,updatable = false。 否則,Hibernate會抱怨一些錯誤。
和
如果有復合主鍵,則必須設置其值。 Hibernate不支持自動生成復合主鍵。
但如果您不喜歡上面顯示的方法,您可以執行以下操作
@Entity
@IdClass(PermissionId.class)
public class Permission {
private Integer field1;
private Integer field2;
private Integer field3;
// required no-arg constructor
public Permission() {}
public Permission(Integer field1, Integer field2, Integer field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Id
@Column(name="FIELD_1", nullable=false)
public Integer getField1() {
return this.field1;
}
@Id
@Column(name="FIELD_2", nullable=false)
public Integer getField2() {
return this.field2;
}
@Id
@Column(name="FIELD_3", nullable=false)
public Integer getField3() {
return this.field3;
}
@Embeddable
public static class PermissionId implements Serializable {
private Integer field1;
private Integer field2;
private Integer field3;
// required no-arg constructor
public PermissionId() {}
public PermissionId(Integer field1, Integer field2, Integer field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Column(name="FIELD_1")
public Integer getField1() {
return this.field1;
}
@Column(name="FIELD_2")
public Integer getField2() {
return this.field2;
}
@Column(name="FIELD_3")
public Integer getField3() {
return this.field3;
}
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof PermissionId))
return false;
final PermissionId other = (PermissionId) o;
if(!(getField1().equals(other.getField1())))
return false;
if(!(getField2().equals(other.getField2())))
return false;
if(!(getField3().equals(other.getField3())))
return false;
return true;
}
// requered hashcode impl
public int hashcode() {
// code goes here
}
}
}
問候,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.