2010-07-22 51 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