我有一對一映射的關聯類。休眠一對一映射不更新子表
@Entity
public class EmployeeEntity
{
@Id
private String id;
private String name;
@OneToOne(mappedBy = "employeeEntity", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "empid")
private AddressEntity addressEntity;
...
...
getters & setters
}
@Entity
public class AddressEntity
{
@Id
@Column(unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", [email protected](name="property", value="employeeEntity"))
private String empId;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private EmployeeEntity employeeEntity;
...
getters & setters
}
我使用Postgres的和具有下面就addressentity表foriegn鍵約束表(employeeentity,addressentity): 外鍵約束: 「fkakhilesh」 外鍵(EMPID)參考employeeentity(ID)ON DELETE CASCADE
我有以下要求用不同的REST調用:
- POST REST調用 - 應該創建一個員工提供地址。
- POST其餘呼叫 - 應創建一個沒有地址的員工。
- GET Rest call - 應該檢索employeee。地址也應該來,如果它存在。
- PUT其餘呼叫 - 應更新員工和地址(如果地址存在)。
- 把REST調用 - 應該更新僱員和地址(在地址傳遞,它已經在EMPID addressentity表存在)
- 把REST調用 - 應該更新的員工,並創建地址(如果地址是過去了,在empid的地址表中不存在)
我能夠在沒有任何問題的情況下執行操作1到5。
主要問題出現在我的腦海裏,並且出現以下問題: 1.當我做「getSession()。update(object)」時,我得到hibernate的StaleStateException:批量更新返回來自update [0 ]。實際行數:0;預期:1. 如果地址不存在,這是不可能的「更新」?我無法在更新期間創建新地址嗎?
我需要改變我的ServiceImpl呼叫合併‘?它如何影響性能「的getSession()。合併(對象)?在這種情況下,只能通過調用來處理’?
如果我做的合併,我得到Hibernate的IdentifierGenerationException:試圖從空一到一個屬性 我在這裏失去了一些東西給ID
,這可以通過改變Hibernate映射解決或事端有關級聯
。?。@GeneratedValue(generator =「gen」)在這裏的重要性是什麼?爲什麼在@GenericGenerator
是@parameter用我新的休眠和試圖進入Hibernate映射的深度。 另外,如果你能在設計上建議我應該是最好的處理方法,我會很高興。
不要緊,如果你使用整數ID或字符串ID。 – akhi 2013-02-28 05:45:55