4

私には人がいるとしましょう

class Person{
    @Id Integer id;

    @OneToOne
    @JoinColumn(name = "person_id")
    Job myJob;
}

と仕事

class Job{
    @Id Integer id;
    Integer person_id;

    @OneToOne
    @PrimaryKeyJoinColumn(name = "person_id")
    Person currentWorker;
}

フェッチするときに、個人とジョブを他のエンティティにマップできません。
私はどんな間違いをしていますか?

4

2 に答える 2

10

コードは次のようになります。

@Entity
public class Person implements Serializable {

    @Id Integer id;

    @OneToOne
    @JoinColumn(name = "id")
    Job myJob;
}

@Entity
public class Job implements Serializable {

    @Id Integer id;

    @OneToOne(mappedBy = "myJob")
    Person currentWorker;
}  

(重複した列'person_id'をジョブから削除する試みを支払います)

または主キーを共有する他のアプローチ:

@Entity
public class Person {
    @Id Integer id;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    Job myJob;
}            

@Entity
public class Job {
    @Id Integer id;
} 
于 2012-05-21T15:06:24.560 に答える
1

この説明では、「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列に直接アクセスします。

于 2017-07-02T23:01:53.683 に答える