6

アノテーションを使用してHibernateマッピングを学習しています。1つのセクションを完了しました。つまり、親テーブルを保存するときに子クラスを自動的に挿入できます。 see_that

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

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;
    }

私のダオクラス

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対多マッピング(ジョイントテーブルではなく、双方向)を使用しています。

私の質問を要約する

1)親テーブルをフェッチするときに子テーブルを取得する方法、またはその逆

2)熱心で怠惰なフェッチとは何ですか。

3)1対多マッピングの場合の単方向、双方向、および結合テーブル。どちらがより強力です。

4

1 に答える 1

5

1)

これらのクラスのエンティティが取得されるたびにこれを実際に実行する場合はFetchMode.EAGER@OneToMany関連付けで指定します。@ManyToOneデフォルトで熱心です。特定の状況でのみこれらのエンティティをフェッチする必要がある場合、これはほとんど非効率的である可能性があることに注意してください。その場合は、同じように行う必要がありますが、Studentオブジェクトを取得したセッションがまだ開いていることを確認してください。Springを使用していることを確認して、DAO / Serviceに注釈を付けて@Transactional、メソッドの実行中にセッションが存続するようにしましたか?または、次のようにを使用してみHibernate.execute()ましたか?

 

   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)この質問を見てください:JavaPersistenceにおけるFetchTypeLAZYとEAGERの違いは?

3)それはあなたが必要とするものに依存します。アソシエーションを一方向にナビゲートする必要がある場合は、その方法でのみ単方向に定義します。両方が必要な場合は、両方を実行してください。結合テーブルは、データベースの設計と関係があります。電話が属する電話Phoneへの参照を含むテーブルにFKを含める場合 、またはすべてののを含む結合テーブルを含める場合。StudentPhonesStudent

于 2011-10-20T08:04:44.350 に答える