休止

2017-04-24 6 views
0

に別のモデルからlazyilyロードされたモデルにアクセスしようとすると、私は休止

@Entity 
    @Table(name = "table_a") 
    public class A{ 
     private Integer p1; 
     private B b; 

     @Id 
     @Column(name="id_a") 
     public Integer getP1() { 
      return p1; 
     } 

     public void setP1(Integer p1) { 
      this.p1 = p1; 
     } 

     @ManyToOne 
     @JoinColumn(name = "t1") 
     public B getB() { 
      return b; 
     } 

     public void setB(B b) { 
      this.b = b; 
     } 

     @Transient 
     public String getBVal(){ 
      if(b != null){ 
       return b.getT2(); 
      } 
      return null; 
     } 
    } 

以下のような2つのHibernateのモデルを持っており、他のモデルBは、この

@Entity 
    @Table(name = "table_b") 
    public class B{ 

     private int t1; 
     private String t2; 

     @Id 
     @Column(name = "t1") 
     public int getT1() { 
      return t1; 
     } 

     public void setT1(int t1) { 
      this.t1 = t1; 
     } 

     @Column(name = "t2") 
     public String getT2() { 
      return t2; 
     } 

     public void setT2(String t2) { 
      this.t2 = t2; 
     } 
    } 

のように見える私が使用したときに問題があります私のコードでクラスAの "getBVal"メソッドが時々私に奇妙なNullpointer Exceptionをスローする 対応するトランジェントメソッドのヌルチェックが既にあるので! なぜこのnpeが来るのか、どのように私はこれを避けることができますか?

ありがとうございました! Bは、属性が、関係、次のようになりマッピングの正しい方法ではないので

+1

ログを共有できますか?ありがとうございました! – Aurasphere

+0

データベースの整合性をチェックしてください。これは、別のテーブルから存在しないIDを指すときに発生します。 – maszter

答えて

0

まずあなたはB.

にエンティティAのrelatonshipマッピングを変更する必要があります。

@OneToOne // Or @ManyToOne depending on your cardinality 
@JoinColumn(name = "tx_b") 
public B getB() { 
    return b; 
} 

@OneToOne@ManyToOneリレーションシップマッピングのデフォルトのフェッチタイプはFetchType.EAGERです。つまり、エンティティAをロードすると、関連付けられたBエンティティもロードされます。

残りのコード(getBVal()メソッドを使用する場所)を確認することなく、さらに多くのことを伝えることはできません。

+0

私は既に自分のエンティティで@ManyToOne関係を定義しています。 – sumit

+0

申し訳ありませんが、私は私の答えを投稿したときに更新された質問を見たことがありません。ログとgetBVal()メソッドを使用している場所を共有してください。 –