1º 一个 Permission 对象具有三个字段
2º Permission 的三个字段组成组合键
属性和复合主键共享相同的列
所以你的问题看起来像这个
@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
}
}
}
问候,