6

Estoy aprendiendo la asignación de hibernación mediante la anotación. He completado una sección. Es decir. Puedo insertar clases secundarias automáticamente cuando guardo la tabla principal. see_that.no se pudo inicializar lentamente una colección de roles: com.pojo.Student.phonenos, no se cerró sesión o sesión

Pero no obtuve la tabla secundaria cuando estoy buscando la tabla maestra. También aparece un error

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

Mi código se agrega aquí para que lo revise. Por favor revisa esto. Y dame el gran consejo. Student.java. (Clase padre)

@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 (clase hija)

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

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

hacia fuera puesta es

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

Aquí estoy usando unidireccional (clave externa) asignación de uno a muchos (no j tabla unint, bidireccional).

Summerizing mi pregunta

1) cómo conseguir tabla secundaria cuando se trae la tabla primaria, viceversa

2) lo que está ansioso y perezoso obtención de información.

3) unidirection, bidirection, and join table en el caso del mapeo One-To-Many, que es uno más lleno de potencia.

Respuesta

5

1)

Si quieres realmente hacer esto cada vez que se recupera cualquier entidad de estas clases, especifique FetchMode.EAGER en la asociación @OneToMany. @ManyToOne están ansiosos por defecto. Tenga en cuenta que esto podría ser bastante ineficaz si necesita buscar esas entidades solo en circunstancias particulares. Si ese es el caso, debe hacerlo como lo hace, pero asegúrese de que la sesión que recuperó el objeto Student aún esté abierta. Al ver que está utilizando Spring, ¿ha intentado anotar su DAO/Servicio con @Transactional, para que la sesión se mantenga activa durante la ejecución del método? ¿O ha intentado usar Hibernate.execute(), así:

 

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) Tomar un vistazo a esta pregunta: Difference between FetchType LAZY and EAGER in Java persistence?.

3) Depende de lo que necesite. Si solo necesita navegar la asociación de una manera, definala unidireccional de esa manera solamente. Si necesita ambos, haga ambas cosas. Join Table tiene más que ver con el diseño de la base de datos. Si desea tener un FK en la tabla Phone con la referencia al Student al que pertenece el teléfono, o si desea tener una tabla de combinación con el Phones de cada Student.

+0

El código no funciona ... getHibernateTemplate(). Execute (new HibernateCallback() error de compilación. – jaleel

+0

Tnx. para la repetición ... esperando la solución. – jaleel

+0

¿Ha intentado anotar el DAO o el método con '@ Transactional'? ¿Tiene un transactionManager en su applicationContext.xml? –

Cuestiones relacionadas