2010-07-22 36 views
2

我有一個數據庫,其中所有的表都是由Java JPA/Hibernate代碼生成的。我需要在我在一個類似的方式來更新數據庫中幾個表,無法刪除或更新父行 - 帶休眠的JPA

UPDATE Department SET id=100000 WHERE id=0; 

不幸的是這導致了錯誤

ERROR 1451(23000):無法刪除或更新父行:一外鍵約束失敗(departmentuserlink,約束FK96AF44EAB09C41C5外鍵(部門標識)REFERENCES部門(ID))

這裏是Java實體:

@Entity 
@Table(name="Department") 
public class Department extends AbstractEntity implements IAbstractEntity { 

@OneToMany(cascade=CascadeType.ALL, mappedBy="department", fetch=FetchType.EAGER) 
private Set<DepartmentJobLink> departmentJobs = new HashSet<DepartmentJobLink>(0); 

    //Setters & getters and all that 
} 



@Entity 
@Table(name="edrDepartmentJobLink",  uniqueConstraints={@UniqueConstraint(columnNames={"department_id", "job_id"})}) 
public class DepartmentJobLink extends AbstractEntity implements IAbstractEntity { 

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="department_id", nullable=false) 
private Department department; 

    //Setters & getters and all that 
} 

它們在超類中都有ID。到目前爲止,它看起來像一切關於他們的偉大工程,只是經營陷入困境與更新系的主鍵。我將不勝感激任何建議。謝謝。

回答

2

那麼,外鍵並表更新有哪些?聽起來像是你不能改變的department.id價值,因爲一些其他的表有外鍵約束在它的department_id列指向department.id

其實,這是「一件好事」,因爲它意味着你的數據是可靠的。

你需要改變你的更新語句,讓你也與department.id一起更新受影響的表的department_id列(以及任何其他受影響的表),或任選你可以ALTER外鍵約束,這樣的變化是級聯。執行此操作的語法會因您的數據庫實施而異。

這實際上與JPA或Hibernate沒有任何關係 - 它純粹是數據庫中聲明的外鍵約束的結果(可能來自Hibernate映射並從Hibernate自動生成數據庫模式模式生成器工具,但現在不相關)。

+0

因此,根據您的意思以及從查看PhpMyAdmin中的表中看來,列註釋中的級聯= CascadeType.ALL不會導致在實際表上設置級聯更新。您是否知道是否有辦法通過JPA向表本身添加級聯更新,或者在需要時自行添加它們,從而獲得最佳服務? 感謝您的輸入。我相信我對現在發生的事情有了更好的理解。 – Donny 2010-07-22 21:23:09

+0

JPA不會爲您創建表。可能有一些工具可以根據JPA註釋/休眠映射自動生成表定義*,但不像使用JPA意味着爲您處理表創建。 JPA方面的「級聯」意味着不同的東西。 – 2010-07-23 01:45:56