次の問題が発生しています。Employee
クラスを次のデータベーススキーマにマップする必要があります(id1とid2は複合主キーです)。
--------------------------
| id1 | id2 | ManagerId2 |
--------------------------
| 1 | 1 | NULL | <--- Have no manager / Can be manager of many
--------------------------
| 1 | 2 | 1 | <--- Is manager / Has manager 1-1
--------------------------
| 1 | 3 | 1 | <--- Is manager / Has manager 1-1
--------------------------
外部キーには、それが参照する主キーと同じ列(同じ列数)が必要であることを認識しています。重要なのは、Employee
が挿入されると、。id1 = 1
を使用してマネージャーのみを参照する必要があるということid1 = 1
です。整合性を維持し、次のようなシナリオを回避する方法:
---------------------------------------
| id1 | id2 | ManagerId1 | ManagerId2 |
---------------------------------------
| 1 | 1 | NULL | NULL | <--- Have no manager / Can be manager of many
---------------------------------------
| 2 | 1 | NULL | NULL | <--- Have no manager / Can be manager of many
---------------------------------------
| 1 | 2 | 2 | 1 | <--- THIS IS NOT ALLOWED
---------------------------------------
| 1 | 3 | 2 | 1 | <--- NOR THIS
---------------------------------------
これまでのところ、私が得た最良のものは、次のマッピングです(ただし、期待どおりにテーブルが作成され、ManagerId2
フィールドにデータが入力されません)。
@Entity
@Table(name="Employee")
public class Employee {
public Employee(){
}
@EmbeddedId
private EmployeeId id;
public void setId(EmployeeId id) {
this.id = id;
}
public EmployeeId getId() {
return id;
}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumns({
@JoinColumn(name = "id1", referencedColumnName = "id1", insertable=false, updatable=false), //its fine to have this attribute not insertable nor updatable
@JoinColumn(name = "id2_manager", referencedColumnName = "id2", insertable=false, updatable=false) //but I must be able to update this one!
})
private Employee manager;
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
@Embeddable
public class EmployeeId implements Serializable{
public EmployeeId() {
}
public EmployeeId(int id1, int id2) {
this.id1 = id1;
this.id2 = id2;
}
private int id1;
private int id2;
public int getId1() {
return id;
}
public void setId(int id1) {
this.id1 = id1;
}
public int getId2() {
return id2;
}
public void setId2(int id2) {
this.id2 = id2;
}
//hashCode and equals properly overriden
}
一日中ゴーグルした後、何も見つからないようです!誰かが私が間違っていることを親切に教えてくれますか、または何か良いリソースを指摘できますか?
PS:dbスキーマを変更できません。オプションではありません