2012-01-22 11 views
6

私は休止状態の初心者です。私は、次のコードではPersonとPersonDetailエンティティ間の1対1のマッピングを作成しようとしていた。アノテーションのmappedBy属性の意味?

@Entity 
public class Person { 

    private int personId; 
    private String personName; 
    private PersonDetail personDetail; 

    @OneToOne(mappedBy="person") 
    public PersonDetail getPersonDetail() { 
     return personDetail; 
    } 

    public void setPersonDetail(PersonDetail personDetail) { 
     this.personDetail = personDetail; 
    } 

    @Id 
    @GeneratedValue 
    public int getPersonId() { 
     return personId; 
    } 

    public void setPersonId(int personId) { 
     this.personId = personId; 
    } 

    public String getPersonName() { 
     return personName; 
    } 

    public void setPersonName(String personName) { 
     this.personName = personName; 
    } 
} 


@Entity 
public class PersonDetail { 

    private int personDetailId; 
    private String zipCode; 
    private String job; 
    private double income; 

    private Person person; 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    @Id 
    @GeneratedValue 
    public int getPersonDetailId() { 
     return personDetailId; 
    } 

    public void setPersonDetailId(int personDetailId) { 
     this.personDetailId = personDetailId; 
    } 

    public String getZipCode() { 
     return zipCode; 
    } 

    public void setZipCode(String zipCode) { 
     this.zipCode = zipCode; 
    } 

    public String getJob() { 
     return job; 
    } 

    public void setJob(String job) { 
     this.job = job; 
    } 

    public double getIncome() { 
     return income; 
    } 

    public void setIncome(double income) { 
     this.income = income; 
    } 

} 

私はPersonDetailが所有するエンティティであることを望む(私はちょうどその逆が正しいことを知っているが、Iテストしたい)。私が理解していないのは、私がPersonエンティティに入れたmappedBy属性の使用です。 "テーブルのPerson:列:[org.hibernate.mapping.Column(personDetail)]" com.hibernate.onetoonemapping.PersonDetailの型を判別できませんでした。 "

このmappedBy属性は何をしますか?私はmappedBy属性が非所有側に置かれていることを読んだ。しかし、それは正確に何をしていますか?

答えて

7

これは、エンタイト間の関係が既にマップされていることを意味しています。そのため、2回は行いません。 mappedBy属性を使用することで、ちょうど「そこそこにやったよ」と言うだけです。

3

シナリオでは、mappedBy属性は影響を与えません。

私はプライマリキーの名前( "id"とは異なります)を混同していましたが、識別子として非標準の名前を使用していても、あなたが直面している問題は発生しません。

私はOneToManyとOneToOneの関連付けのコンテキストでmappedByパラメータを実験しており、私の知見を共有したいと考えています。私は、テストの目的と影響を説明するために同様のシナリオを持っています。

Person.class:

@Entity 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "name") 
    private String name; 

    @OneToOne 
    private Address address; 
} 

Address.class(OneToOne試験用):

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "address") 
    private String address; 


    @OneToOne(mappedBy="address") 
    private Person person; 

    @OneToMany(cascade = CascadeType.ALL) 
    private Set<Phone> phone = new HashSet<Phone>(); 
} 

Phone.class(OneToMany試験用):

@Entity 
public class Phone { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(optional = false) 
    private Person person; 

    @Column(name = "number") 
    private String number; 
} 

「マップmappedByは 『自動的に休止状態に結合テーブルを使用しています。edBy」私はあなたが指定していない場合ことがわかっOneToMany団体については

Hibernate: 
/* insert domain.Address 
    */ insert 
    into 
     Address 
     (id, address) 
    values 
     (default, ?) 
Hibernate: 
/* insert domain.Person 
    */ insert 
    into 
     Person 
     (id, address_id, name) 
    values 
     (default, ?, ?) 

がOneToOne協会のパラメータは、どのような場合には休止状態で実行されるSQL文は同じままでした』一方、「mappedBy」パラメータでは、関連付けはエンティティテーブル内の別個の列としてマッピングされます。次の文で1つの電話エントリ結果を持つ人をpersising

@OneToMany(cascade = CascadeType.ALL) 
private Set<Phone> phone = new HashSet<Phone>(); 

私が使用している場合

は... ...実行する:使用するのに対し

Hibernate: 
/* insert domain.Phone 
    */ insert 
    into 
     Phone 
     (id, number, person_id) 
    values 
     (default, ?, ?) 
Hibernate: 
/* insert collection 
    row domain.Person.phone */ insert 
    into 
     Person_Phone 
     (Person_id, phone_id) 
    values 
     (?, ?) 

...1はおそらく、この場合に期待されるものに近い若干異なるリレーショナルモデルで

@OneToMany(mappedBy="id", cascade = CascadeType.ALL) 
private Set<Phone> phone = new HashSet<Phone>(); 

結果:

Hibernate: 
/* insert domain.Phone 
    */ insert 
    into 
     Phone 
     (id, number, person_id) 
    values 
     (default, ?, ?) 
4

あなたはのいずれかの側からの双方向の関係は、(アクセスできるようにしたいですあなたがだけ関係を定義することができますので、非所有側のmappedByを使用した場合。

mappedByは、エンティティのインスタンスを作成してそれらにデータをロードする方法をHibernateに伝えます。これは、この例では、関係が定義されている、PersonDetailという注釈を付けているクラスのフィールド名を参照する必要があります。

関連する問題