この説明では、「update」などのプロパティがpersistence.xmlのhibernate.hbm2ddl.autoに割り当てられ、Hibernateが1対1の関係を確立し、所有エンティティに非所有エンティティの外部キーを作成できるようにすることを前提としています。 、対応するテーブルの外部キーID列と一緒に。ただし、このプロセスは、テーブルの作成時に関係が確立されている場合にのみ成功します。@JoinColumnと@OneToOne(mappedBy)を既存のエンティティに追加すると、HibernateはFK列が所有テーブルに存在しないと文句を言います。したがって、ライブデータを含むテーブル間の関係を実装する場合は、FK列を手動で追加する必要があります。その後、HibernateはFKg6wt3d1u6o13gdc1hj36ad1otのような奇妙な名前でFK制約を確立できるようになります。
関連するニュアンスは、もう少し詳細な例で示されています。エンティティContactがOneToOneに参加しているさまざまなテーブル(従業員、顧客、ベンダーなど)の共通コンポーネントであるデータベースについて考えてみます。予備的な考慮事項として、OneToOne関係は双方向である可能性がありますが、Hibernateでの実装では、各所有エンティティのテーブルにFKが作成されるように、共通エンティティに非所有指定が割り当てられます。OneToOneを逆に実装すると、Hibernateは非所有クラスで外部キーを検索し、見つからない場合はエラーをスローします。(そこに行って、それをしました。)
@Entity // common, non-owning entity
public class Contact implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Integer id;
@Column(name="fn")
private String firstName;
@Column(name="ln")
private String lastName;
// "person" is the Contact entity as declared in Director
@OneToOne(optional=false, mappedBy = "person")
private Director director;
// GETTERS & SETTERS
と
@Entity // owning entity
public class Director implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Integer id;
@Column(name="title")
private String title;
@OneToOne
@JoinColumn
private Contact person;
public Integer getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Contact getPerson() {
return person;
}
public void setPerson(Contact person) {
this.person = person;
}
FK列がDirectorに存在すると仮定すると、コードは次のように生成します。
alter table Director
add constraint FKg6wt3d1u6o13gdc1hj36ad1ot
foreign key (person_id)
references Contact (id)
HibernateがDirectorのContactエンティティに割り当てるFK名の由来は、少しわかりにくいです。これは、所有エンティティ(ここではperson)+ "_"+エンティティの主キー"id"のContactインスタンス変数に割り当てられた変数名の連結であり、person_idを生成します。@OneToOne(mappedBy = "person")アノテーションは、この同じContactインスタンス変数を参照していることにも注意してください。最後に、HibernateはDirectorクラスの対応するゲッターとセッターを必要とせずにFK列に直接アクセスします。