以前は @PrimaryKeyJoinColumn が機能していましたが、今はスプリング ブートを試していますが、何が足りないのかわかりません。すべてを正しく行ったように見えるので、非常に奇妙です。
人物クラス :
@Table(name = "PERSON")
@Entity
@Getter
@Setter
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(cascade = CascadeType.PERSIST)
@PrimaryKeyJoinColumn
private Department department;
}
部門クラス :
@Table(name = "DEPARTMENT")
@Entity
@Getter
@Setter
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "department")
private Person person;
}
サービスクラス:
@Transactional
public void addPerson() {
Person person = new Person();
person.setName("person 1");
Department department = new Department();
department.setName("test");
department.setPerson(person);
person.setDepartment(department);
personRepository.save(person);
}
それは私が DB で取得するものです: Person テーブル:
ID Name
13 person 1
部門表:
ID Name
18 test
望ましい出力: 両方の ID が同一である必要があります (個人 ID は 13 ではなく 18 である必要があります)。
更新: hibernate は常に ID なしで Person を挿入しようとするため、Person ID から自動インクリメントを削除し、既存の部門を持つ人を挿入しようとすると、次のようになります。
Hibernate: insert into person (name) values (?)
Field 'id' doesn't have a default value
更新 2: @PrimaryKeyJoinColumn は ID 生成を部門クラスとして処理しないようです。そのため、ジェネレーターを使用する必要があります。サブクラスのIDを何もせずに結合した継承で同じアノテーションが機能するのだろうか。したがって、 ID 生成が Inheritance Joined で機能する理由を説明する答えを期待していますが、 OneToOne にはジェネレーターが必要です