2

すべてのテーブルが Java JPA/Hibernate コードによって生成されたデータベースがあります。これと同様の方法で、データベース内のいくつかのテーブルを更新する必要があります。

UPDATE Department SET id=100000 WHERE id=0;

残念ながら、これはエラーになります

エラー 1451 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました (departmentuserlink, CONSTRAINT FK96AF44EAB09C41C5 FOREIGN KEY (department_id) REFERENCES department (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 があります。これまでのところ、部門の主キーの更新で問題が発生しただけで、それらに関する他のすべてがうまく機能しているように見えます。アドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

2

さて、更新されるテーブルにはどのような外部キーがありますか?department.id他のテーブルのdepartment_id列がを指す外部キー制約があるため、の値を変更できないようですdepartment.id

これは、データが信頼できることを意味するため、実際には「良いこと」です。

department_id影響を受けるテーブルの列department.id(およびその他の影響を受けるテーブル)も更新するようにupdateステートメントを変更する必要があります。または、オプションALTERで、変更がカスケードされるように外部キー制約を変更することもできます。これを行うための構文は、データベースの実装によって異なります。

これは実際にはJPAやHibernateとは何の関係もありません-これは純粋にデータベースで宣言された外部キー制約の結果です(これはHibernateマッピングから来ており、Hibernateスキーマジェネレータツールからデータベーススキーマを自動生成している可能性があります、しかし、それは今は無関係です)。

于 2010-07-22T20:52:56.623 に答える