2012-07-30 8 views
25

mappedByマップは何ですか?または、むしろ、それはどのようにマップされるべきですか?@OneToMany mappedByは_____にマップ

@OneToManydocsあたりとして@EntityFooにマップ以下headersフィールド?そしてFoojavax.mail.Headerのラッパーになりますか?

package net.bounceme.dur.usenet.model; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.mail.Header; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.persistence.*; 

@Entity 
public class Articles implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = Logger.getLogger(Articles.class.getName()); 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column 
    private String subject; 

    @OneToMany(mappedBy="foo") //a wrapper for Header is needed? 
    private List<Header> headers = new ArrayList<>(); 

    public Articles() { 
    } 

    public Articles(Message message) { 
     try { 
      subject = message.getSubject(); 
     } catch (MessagingException ex) { 
      Logger.getLogger(Articles.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Articles)) { 
      return false; 
     } 
     Articles other = (Articles) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return subject; 
    } 

    public String getSubject() { 
     return subject; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 
} 

答えて

27

はい、javax.mail.Headerのラッパーが必要です。一般に、任意のクラスを直接継承することはできません。特に、シリアライズ可能ではないクラスは継承できません。また、エンティティ間の関係を設計するリストの要素にすることもできません。

mappedByの値は、双方向関係の所有側のフィールドの名前です。

@OneToMany(mappedBy="article") 
private List<Foo> headers; 

は今、私たちはこの関係のもう一方の端がなければならないことを知って、それがある属性、次のとおりです。例のために、のはFooのエンティティへの1対多の関係を持っていない同条の実体を想定してみましょう双方向の関係がデータベースに永続化されるときに使用される

@Entity 
public class Foo { 
... 
    @ManyToOne 
    Article article; 
} 

所有側(Fooの中に、この場合の記事で):フー・エンティティに位置、種類などの記事を持っていると記事という名前です。 JPA 2.0仕様では、これは、次の言葉で語られている:

管理エンティティ間の双方向の関係は、関係の所有側に保持されている参考文献に基づいて を永続化されます。メモリ内の参照を保持側に保持する開発者の責任は、 であり、変更時に互いに反対側に保持されている参照は、 と一致します。単方向の1対1の場合、 と一対多の関係は、関係のセマンティクスが守られることを保証するのは、 を保証する開発者の責任です。

+2

わかりやすく、試してみてください:) – Thufir

+0

Okですが、例外があります。説明:[class net.bounceme.dur.usenet.model.Articles]は、非エンティティ[class javax.mail.Header]を次のように使用します。リレーションシップアトリビュート[フィールドヘッダー]のターゲットエンティティ.'だから、私はそれを再考する必要があります。また、それはManyToManyになると思いますが、私はデータベース内のあらゆる可能なヘッダを望んでいませんが、それは道のりです。私はこの質問に答えると思います。ありがとう:) – Thufir

1

ここでチェック:documentation

関連する部分は次のとおりです。

 mappedBy 
     The field that owns the relationship. 

それは自明のようなものです。例が必要ですか?

記事多くのヘッダを持っているので、あなたはArticleは、例えば、多くのHeaderオブジェクトを持って、その後Articleはrealationshipを所有している場合。

+2

フィールドはどのクラスですか? – Thufir

+7

と言って、ドキュメントは良い答えではありません!特に恐ろしいAPIのドキュメントが書かれています。エンティティフレームワークの新機能ですが、ここで重要な点は、**他の**クラスのフィールド(通常はプライベート)を参照することに注意することです。 –

+1

私はこの質問をよく思い出しません。私は通常、答えをdownvoteしません、それは価値がある(それは実際には上記のケースではない馬鹿な答えである必要があります)が、私はドキュメントリンクは6よりもむしろjavaee5することに注意してください。私は、「所有関係」という文法が、「Article」が所有関係であることを助けていると思います。個人的には、私はRTFMリンクを気にすることはありません。「マニュアル」ではなく、ページやセクションに限られています。 – Thufir