2017-07-19 10 views
0

私はPersonとPhoneの間の単純な関係をしたいと思います。この場合、1人は多くの電話番号を持つことができます。@OnetoMany関係Hibernate Spring MVC

はこのように、私がモデルで、この関係を使用しています。要約:

クラスの人( "ペソア"):

@Entity 
public class Pessoa { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int idPessoa; 

    @OneToMany(mappedBy = "pessoa", targetEntity = Telefone.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<Telefone> telefone; 

    public int getIdPessoa() { 
     return idPessoa; 
    } 
    public void setIdPessoa(int idPessoa) { 
     this.idPessoa = idPessoa; 
    } 
    public List<Telefone> getTelefone() { 
     return telefone; 
    } 
    public void setTelefone(List<Telefone> telefone) { 
     this.telefone = telefone; 
    } 

} 

クラスの電話番号( "Telefone"):

@Entity 
public class Telefone { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int idTelefone; 
    private TipoTelefone tipoTelefone; 
    private int numeroTelefone; 
    @ManyToOne 
    @JoinColumn(name="idPessoa") 
    private Pessoa pessoa; 

    public TipoTelefone getTipoTelefone() { 
     return tipoTelefone; 
    } 
    public void setTipoTelefone(TipoTelefone tipoTelefone) { 
     this.tipoTelefone = tipoTelefone; 
    } 
    public int getNumeroTelefone() { 
     return numeroTelefone; 
    } 
    public void setNumeroTelefone(int numeroTelefone) { 
     this.numeroTelefone = numeroTelefone; 
    } 
} 

私はなぜ知らないが、携帯電話に関連するデータidPessoa(idPerson)ではなく、テーブル間の関係が失われました。形で使用

table phone

他のすべて件のデータが、でもOnetoOne関係がうまく記録され、これだけOneToMayは、問題を提示しています。

+0

を使用することができます私はまた、休止状態では初心者ですが、私はあなたが以下のようなidpersonためにどこかにデータを設定する必要があると思う:telephone.setPerson(人)のためにデータベースが更新されています。 – user8271644

+0

意図的にゲッターとセットを 'Telefone'クラスに表示していないのですか?コードでそれらを見逃しましたか?適切なゲッタとセッタがなければ、問題が発生する可能性があります。 – raiyan

+0

私は逃しゲッタとセッタを追加しましたが、まだ動作しませんでした –

答えて

0

あなたは、このような関係を設定し、両方のエンティティを保存する場合は、両側の関係を設定する必要があります。そうでなければ、第1のエンティティを保存することによって関係を設定し、第2のエンティティを保存することでそれを再び削除することができる。

は、だから、関係を設定する電話機の人物を設定している場合がありますが、明示的に人の携帯電話のリストに電話を追加しないでください。電話を持続すると、関係が設定されます。しかし、人が永続化されている場合(リストを埋めるために再び取り出される前に)、永続化された人物がそのリストに電話を持っていないため、hibernateは関係を再度削除します。

他の方法で回避、人の携帯電話のリストに電話を追加することなく、人が最初に、その後の電話永続化されている場合は、電話機の人物を設定しないと、同じことを行うことができます。

だから、2つの選択肢があります。
オプション1:両方のエンティティを永続化する場合は、両方の関係を管理する必要があります。
オプション2:関係を設定するために使用されるエンティティを維持し、他のものを保持しません。それを使用し続けないでください(それをさらに使用する必要がある場合は、データベースから再度検索して置き換えてください)。
両方のエンティティに変更があり、それらを保存する必要がある場合は、オプション1が最も簡単です。あなただけの両方のエンティティのいずれかに変更がある場合は、オプション2

関連する問題