6

注釈を使用している休止状態マッピングを学習しています。私は1つのセクションを完了しました。私。親テーブルを保存すると自動的に子クラスを挿入できます。 see_thatロールのコレクションを遅延して初期化できませんでした:com.pojo.Student.phonenos、セッションもセッションも閉じられていません

しかし、私はマスターテーブルをフェッチしているときに子テーブルを取得しませんでした。エラーを取得する

failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed 

ここにあなたのレビューを掲載するコードが追加されました。それを通過してください。そして、私に大きなアドバイスをください。 Student.java。 プットアウト(親クラス)

@Entity 
    @Table(name="STUDENT") 
    public class Student { 
    private int studentid; 
    private String studentName; 
    private Set <Phone> phonenos; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="studenId") 
    public int getStudentid() { 
     return studentid; 
    } 
    public void setStudentid(int studentid) { 
     this.studentid = studentid; 
    } 
    @Column(name="studenName") 
    public String getStudentName() { 
     return studentName; 
    } 
    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 
    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name="studenId") 
    public Set<Phone> getPhonenos() { 
     return phonenos; 
    } 
    public void setPhonenos(Set<Phone> phonenos) { 
     this.phonenos = phonenos; 
    } 

Phone.java(子クラス)

@Entity 
@Table(name = "PHONE") 
public class Phone { 
    private int phoneid; 
    private String phoneNo; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "phoneId") 
    public int getPhoneid() { 
     return phoneid; 
    } 
    public void setPhoneid(int phoneid) { 
     this.phoneid = phoneid; 
    } 
    @Column(name = "phoneno") 
    public String getPhoneNo() { 
     return phoneNo; 
    } 
    public void setPhoneNo(String phoneNo) { 
     this.phoneNo = phoneNo; 
    } 

私のDAOクラス

public List<Student> getAllStudent() { 
     List<Student> studentList = null; 
     try { 
      DetachedCriteria criteria = DetachedCriteria.forClass(Student.class); 
      studentList = (List<Student>)getHibernateTemplate().findByCriteria(criteria); 
       if(studentList != null && ! studentList.isEmpty()){ 
       for(Student st :studentList){ 
        System.out.println(" st name : "+st.getStudentName()); 
        if(st.getPhonenos() != null && ! st.getPhonenos().isEmpty()){ 
         for(Phone ph : st.getPhonenos()){ 
          System.out.println(" ph no : "+ ph.getPhoneNo()); 
         } 
        }else{ 
         System.out.println(" phone number is null"); 
        } 
       } 
      }else{ 
       System.out.println(" student null"); 
      } 
     } catch (DataAccessException e) { 
      e.printStackTrace(); 
     } 
     return studentList; 
    } 

ここで私は一方向の使用しています

failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed 

です(外部キー)1対多マッピング(jではなくオイントテーブル、双方向)。

熱心とフェッチ怠惰である私たちはその逆

2、親テーブルをフェッチするとき、子テーブルを取得するにはどのように私の質問

1))Summerizing。

3)1対多マッピングの場合、単方向性、双方向性、および結合テーブルのうち、電力がいっぱいであるもの。あなたはこれらのクラスの任意のエンティティが取得され、このたびを行うには本当にしたい場合は

答えて

5

1)

@OneToMany関連してFetchMode.EAGERを指定します。 @ManyToOneはデフォルトでは熱望しています。これらのエンティティを特定の状況でのみ取得する必要がある場合は、これが大きく不安定になる可能性があることに注意してください。そのような場合は、実行しているようにする必要がありますが、Studentオブジェクトを取得したセッションがまだ開いていることを確認してください。あなたがSpringを使っているのを見て、メソッドの実行中にセッションが生き続けるように、@TransactionalでDAO/Serviceに注釈を付けてみましたか?それとも、このように、Hibernate.execute()を使用して試してみました:Difference between FetchType LAZY and EAGER in Java persistence?

 

getHibernateTemplate().execute(new HibernateCallback(){ 
    @SuppressWarnings("unchecked") 
    public Object doInHibernate(Session s) throws HibernateException, SQLException { 
     Criteria c = s.createCriteria(Student.class); 
     List<Student> studentList = c.list(); 
     for(Student st :studentList){ 
      st.getPhoneNos(); 
     } 
    } 
}); 

2)は、この質問を見てみましょう。

3)必要なものによって異なります。ある方法でアソシエーションをナビゲートする必要がある場合は、その方法でのみ単方向を定義します。両方が必要な場合は、両方を行います。結合表は、データベース設計と関連があります。電話番号がStudentへの参照を含むPhoneテーブルにFKを設定する場合は、StudentPhonesの参加テーブルを作成する必要があります。

+0

コードの一部が動作していません... getHibernateTemplate()。execute(新しいHibernateCallback()コンパイルエラーです。 – jaleel

+0

Tnx。あなたはリプレイのために解決策を期待しています。 – jaleel

+0

DAOまたはそのメソッドに '@ Transactional'を注釈付けしてみましたか? applicationContext.xmlにtransactionManagerがありますか? –

関連する問題

 関連する問題