Fehler beim Initialisieren einer Sammlung von Rollen: com.pojo.Student.phonenos, keine Sitzung oder Sitzung wurde geschlossen

StackOverflow https://stackoverflow.com/questions/7832433

Frage

Ich lerne die Zuordnung des Ruhezustands mithilfe von Anmerkungen. Ich habe einen Abschnitt abgeschlossen. Das heißt, Ich kann die untergeordnete Klasse automatisch einfügen, wenn ich die übergeordnete Tabelle speichere. siehe_das .

Aber ich habe die untergeordnete Tabelle beim Abrufen der Mastertabelle nicht erhalten. Es wird auch ein Fehler angezeigt

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

Mein Code wird hier hinzugefügt, um Sie zu überprüfen. Bitte gehen Sie es durch. Und gib mir den tollen Rat. Student.java. (Elternklasse)

@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 (untergeordnete Klasse)

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

meine Dao-Klasse

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

Ausgabe ist

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

Hier verwende ich eine unidirektionale (Fremdschlüssel-) Eins-zu-Viele-Zuordnung (keine gemeinsame Tabelle, bidirektional).

Sommerisierung meiner Frage

1) wie man eine untergeordnete Tabelle erhält, wenn wir die übergeordnete Tabelle abrufen, und umgekehrt

2) Was ist eifrig und faul zu holen.

3) Unidirektion, Bidirektion und Join-Tabelle im Fall einer Eins-zu-Viele-Zuordnung, bei der mehr Leistung vorhanden ist.

War es hilfreich?

Lösung

1)

Wenn Sie dies wirklich jedes Mal tun möchten, wenn eine Entität dieser Klassen abgerufen wird, geben Sie FetchMode.EAGER in der @OneToMany-Zuordnung. @ManyToOne sind standardmäßig eifrig. Beachten Sie, dass dies möglicherweise weitgehend ineffizient ist, wenn Sie diese Entitäten nur unter bestimmten Umständen abrufen müssen. Wenn dies der Fall ist, müssen Sie es wie gewohnt tun, aber stellen Sie sicher, dass die Sitzung, in der das Student-Objekt abgerufen wurde, noch geöffnet ist. Haben Sie versucht, Ihr DAO / Ihren Dienst mit @Transactional zu versehen, damit die Sitzung während der Ausführung der Methode am Leben bleibt, da Sie Spring verwenden? Oder haben Sie versucht, Hibernate.execute() wie folgt zu verwenden:

   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) Sehen Sie sich diese Frage an: Unterschied zwischen FetchType LAZY und EAGER in der Java-Persistenz? .

3) Es hängt davon ab, was Sie brauchen. Wenn Sie die Zuordnung nur auf eine Weise navigieren müssen, definieren Sie sie nur auf diese Weise unidirektional. Wenn Sie beides benötigen, tun Sie beides. Join Table hat mehr mit dem Datenbankdesign zu tun. Wenn Sie eine FK in der Phone-Tabelle mit dem Verweis auf den Student haben möchten, zu dem das Telefon gehört, oder wenn Sie eine Join-Tabelle mit dem Phones jedes Students haben möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top