雖然它很簡單,但我找不到任何解決方案。我使用的是playframework 1.2.3,它使用Hibernate作爲JPA。所以我認爲playframework與這個問題無關。JPA實體設計/無法刪除實體
我有一些類(I省略非相關字段)
public class User {
...
}
public class Task {
public DataContainer dataContainer;
}
public class DataContainer {
public Session session;
public User user;
}
public class Session {
...
}
所以,我有關聯從任務以DataContainer和從DataContainer到Sesssion和DataContainer屬於用戶。 DataContainers可以始終具有相同的用戶,但每個實例的會話必須不同。而且任務的DataContainer在每種情況下也都不相同。一個DataContainer可以有一個Sesesion或不(它是可選的)。我只使用單向聯想。它應該是足夠的。
換句話說:每個任務必須有一個DataContainer。每個DataContainer 必須有一個/相同的用戶和可以有一個會話。
要創建我使用JPA註釋的DB模式:
@Entity
public class User extends Model {
...
}
@Entity
public class Task extends Model {
@OneToOne(optional = false, cascade = CascadeType.ALL)
public DataContainer dataContainer;
}
@Entity
public class DataContainer extends Model {
@OneToOne(optional = true, cascade = CascadeType.ALL)
public Session session;
@ManyToOne(optional = false, cascade = CascadeType.ALL)
public User user;
}
@Entity
public class Session extends Model {
...
}
BTW:型號是一齣戲類,提供了主ID,只要型。
當我爲每個實體創建一個對象並'連接它們',我的意思是關聯,它工作正常。但是,當我嘗試刪除一個會話時,我得到了一個違反約束的異常,因爲DataContainer仍然引用了我想要刪除的會話。
我希望DataContainer的Session(字段)將分別設置爲null,外鍵(session_id)應該在數據庫中取消設置。這將是可以的,因爲它可選。
我不知道,我想我有多個問題。我是否使用了正確的註釋@OneToOne
?
我在互聯網上發現了一些額外的註釋和屬性: @JoinColumn
和mappedBy
屬性爲反比關係。但我沒有,因爲它不是雙向的。或者是雙向關聯。本質?
另一次嘗試是使用@OnDelete(action = OnDeleteAction.CASCADE)
了該限制從NO ACTION
改過自新的時候更新或刪除:
ADD CONSTRAINT fk4745c17e6a46a56 FOREIGN KEY (session_id)
REFERENCES annotation_session (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE;
但在這種情況下,當我刪除一個會議上,DataContainer和用戶將被刪除。這對我來說是錯誤的。
編輯: 我使用PostgreSQL 9,JDBC的東西,包括在玩,我唯一的數據庫配置是
db=postgres://app:[email protected]:5432/app
也許這個作品:加'@OneToOne DataContainer'成'Session'和修改DataContainer會話屬性'@OneToOne (的mappedBy = 「dataContainer」)'。這樣'DataContainer'類不再需要'session_id'列。 –