En este tutorial vamos a estar viendo como tratar el famoso org.hibernate.LazyInitializationException: el cual es generado cuando en nuestras entidades tenemos un fetch = FetchType.LAZY.
comenzaremos planteando una situacion real:
En el siguiente problema tenemos 3 Entidades
1: Pedidos
2: PedidosPlatosDetalles
3: PedidosBebidasDetalles
class Pedidos{
@Id
@OneToMany(cascade=CascadeType.ALL,mappedBy="pedidos",fetch = FetchType.LAZY)
private List<PedidosPlatosDetalle> pedidosPlatosDetalle;
@OneToMany(cascade=CascadeType.ALL,mappedBy="pedidosDos",fetch=FetchType.LAZY)
private List<PedidosBebidasDetalle> pedidosBebidasDetalle;
//El resto de atributos con sus getters y setters
}
class PedidosPlatosDetalles{
@Id
@ManyToOne()
@JoinColumn(name="fk_id_pedido")
private Pedidos pedidos;
//El resto de atributos con sus getters y setters
}
class PedidosBebidasDetalles{
@Id
@ManyToOne()
@JoinColumn(name="fk_id_pedido")
private Pedidos pedidosDos;
//
}
//----------------------------------------------------------------------------------------------------------------------
Donde un Pedido tiene muchos PedidosPLatosDetalles y a su vez muchos PedidosBebidasDetalles
desde la parte grafica pedidos.xhtml mostramos una tabla donde se cargan todos los pedidos, y a su vez cuando se clickean en los pedidos se pretende traer todos los elementos de la tabla, hasta aca no hay ningun el problema,
el Problema es cuando tratamos de acceder a los atributos de los PedidosPlatosDetalles y PedidosBebidasDetalles porque aun no han sido cargados en memoria, en las siguiente imagenes se ilustran las tablas
En el momento de dar click en el listado de pedidos se obtiene el siguente problema
//----------------------------------------------------------------------------------------------------------------------
09:20:50,014 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-63) /alimentador/feeder.xhtml @369,134 listener="#{mbtpedidos.obtieneListapedidos}": org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jpa.entidades.Pedidos.pedidosPlatosDetalle, could not initialize proxy - no Session: javax.el.ELException: /alimentador/feeder.xhtml @369,134 listener="#{mbtpedidos.obtieneListapedidos}": org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jpa.entidades.Pedidos.pedidosPlatosDetalle, could not initialize proxy - no Session
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:54)
at org.primefaces.event.SelectEvent.processListener(SelectEvent.java:40)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:804)
at javax.faces.component.UIData.broadcast(UIData.java:1086)
at javax.faces.component.UIData.broadcast(UIData.java:1108)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
at com.login.AuthFeederFilter.doFilter(AuthFeederFilter.java:49)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jpa.entidades.Pedidos.pedidosPlatosDetalle, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:278)
at com.transaccionalUno.MBTransaccionalpedidos.obtieneListapedidos(MBTransaccionalpedidos.java:775)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.el.parser.AstValue.invoke(AstValue.java:292)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
... 44 more
09:20:50,022 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default task-63) org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jpa.entidades.Pedidos.pedidosPlatosDetalle, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:278)
at com.transaccionalUno.MBTransaccionalpedidos.obtieneListapedidos(MBTransaccionalpedidos.java:775)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.el.parser.AstValue.invoke(AstValue.java:292)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:54)
at org.primefaces.event.SelectEvent.processListener(SelectEvent.java:40)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:804)
at javax.faces.component.UIData.broadcast(UIData.java:1086)
at javax.faces.component.UIData.broadcast(UIData.java:1108)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
at com.login.AuthFeederFilter.doFilter(AuthFeederFilter.java:49)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
//----------------------------------------------------------------------------------------------------------------------
nuestra vista se comunica con un ManagedBean y la tabla de Lista de Pedidos responde a un evento por medio de un Listener
Codigo de la tabla que carga los Pedidos en el .xhtml
<p:dataTable id="tablasDos" var="pd" value="#{mbtpedidos.pedidostraeLista}" reflow="true" selectionMode="single" selection="#{mbtpedidos.pedidoSeleccionadao}" rowKey="#{pd.id}" >
<f:facet name="header">
Listado de pedidos
</f:facet>
<p:ajax event="rowSelect" listener="#{mbtpedidos.obtieneListapedidos}" update=":formu:tabla,:formu:totalFInal1,:formu:tabla3" />
<p:column headerText="Mesa:">
<h:outputText value="#{pd.mesas.mesa}" />
</p:column>
<p:column headerText="Total:">
<h:outputText value="#{pd.total}" />
</p:column>
</p:dataTable>
La tabla se esta alimentando de un List<> de objetos pedidostraeLista de Tipo Pedidos, y cuando se selecciona la tabla, o se da click en cualquier parte de la tabla, se esta almacenando dicha informacion en un objeto toda su informacion, en el Objeto pedidoSeleccionadao de tipo Pedidos, con el fin de poder asi consultar el ID, el valor, en que mesa se hizo la atencion, etc.
//----------------------------------------------------------------------------------------------------------------------
Del lado del ManagedBean//----------------------------------------------------------------------------------------------------------------------
@ManagedBean(name="mbtpedidos")
@ViewScoped
public class MBTransaccionalpedidos {
/*
Las variables tamanioActual y tamanioActual2 se necesitan para un proposito especifico del funcionamiento de
la aplicacion
*/ public int tamanioActual=0;
public int tamanioActual2=0;
public String cedulaVendedor="1054987036";
public List <Pedidos> PedidostraeLista;
public Pedidos pedidoSeleccionadao;
public List<PedidosPlatosDetalle> pedidosPlatosDetalle;
public List<PedidosBebidasDetalle> pedidosBebidasDetalle;
public List<Pedidos> getPedidostraeLista() {
return transaccional.getPedidosrealizadosBYMesero(cedulaVendedor);
}
public void setPedidostraeLista(List<Pedidos> pedidostraeLista) {
PedidostraeLista = pedidostraeLista;
}
public Pedidos getPedidoSeleccionadao() {
return pedidoSeleccionadao;
}
public void setPedidoSeleccionadao(Pedidos pedidoSeleccionadao) {
this.pedidoSeleccionadao = pedidoSeleccionadao;
}
public List<PedidosPlatosDetalle> getPedidosPlatosDetalle() {
return pedidosPlatosDetalle;
}
public void setPedidosPlatosDetalle(List<PedidosPlatosDetalle> pedidosPlatosDetalle) {
this.pedidosPlatosDetalle = pedidosPlatosDetalle;
}
public List<PedidosBebidasDetalle> getPedidosBebidasDetalle() {
return pedidosBebidasDetalle;
}
public void setPedidosBebidasDetalle(List<PedidosBebidasDetalle> pedidosBebidasDetalle) {
this.pedidosBebidasDetalle = pedidosBebidasDetalle;
}
public void obtieneListapedidos(){
//por medio de<p:ajax event="rowSelect" listener="#{mbtpedidos.obtieneListapedidos}" update=":formu:tabla,:formu:totalFInal1,:formu:tabla3" />
tamanioActual = pedidoSeleccionadao.getPedidosdetalle().size();
tamanioActual2 = pedidoSeleccionadao.getPedidosBebidasDetalle().size();
pedidosPlatosDetalle = pedidoSeleccionadao.getPedidosdetalle();
pedidosBebidasDetalle = pedidoSeleccionadao.getPedidosBebidasDetalle();
/*
en la Variable tamanioActual y tamanioActual2 cuando se hace el llamado al metodo getPedidosdetalle y getPedidosBebidasDetalle
alli es cuando se genera el org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
porque el intenta consultar el tamanio del List<PedidosPlatosDetalle> pedidosPlatosDetalle y del List<PedidosBebidasDetalle> pedidosBebidasDetalle
y como esta en el fetch como Lazy no se han llenado estos List y de esta manera intenta consultar algo que no ha sido cargado en memoria generando dicho error
*/
}
}
//----------------------------------------------------------------------------------------------------------------------
Del lado del EJB
//----------------------------------------------------------------------------------------------------------------------
public class TransaccionalEJBUno implements TransaccionalEJBUnoRemote {
@PersistenceContext
private EntityManager em;
public TransaccionalEJBUno() {
}
@Override
public List<Pedidos> getPedidosrealizadosBYMesero(String cedula) {
//Metodo que trae la informacion que el Mesero alla realizado
List<Pedidos> pedidos;
Query query = em.createQuery("Select pe From Pedidos pe where pe.usuarios.cedula=:cedula",Pedidos.class);
query.setParameter("cedula", cedula);
pedidos = query.getResultList();
return pedidos;
}
}
//----------------------------------------------------------------------------------------------------------------------
Hasta este punto nos encontramos con el org.hibernate.LazyInitializationException: la soucion para tratar el incoveniente en este caso es la siguente,
///---------------------------------------------------------------------------------------
Solucion Del lado del ManagedBean
//----------------------------------------------------------------------------------------------------------------------
@ManagedBean(name="mbtpedidos")
@ViewScoped
public class MBTransaccionalpedidos {
public void obtieneListapedidos(){
List<PedidosPlatosDetalle> platos = transaccional.consultarPlatosDelPediodo(pedidoSeleccionadao.getId());
List<PedidosBebidasDetalle> bebidas = transaccional.consultarBebidasDelPediodo(pedidoSeleccionadao.getId());
pedidoSeleccionadao.setPedidosBebidasDetalle(bebidas);
pedidoSeleccionadao.setPedidosdetalle(platos);
tamanioActual = pedidoSeleccionadao.getPedidosdetalle().size();
tamanioActual2 = pedidoSeleccionadao.getPedidosBebidasDetalle().size();
pedidosPlatosDetalle = pedidoSeleccionadao.getPedidosdetalle();
pedidosBebidasDetalle = pedidoSeleccionadao.getPedidosBebidasDetalle();
/*
Como se puede apreciar se crearon 2 metodos mas en el EJB consultarPlatosDelPediodo(int id) y consultarBebidasDelPediodo(int id), de esta manera
estamos enviandole a estos metodos el ID del pedido, donde vamos a recuperar la informacion que coincida en la consulta que se realize en el EJB con
dicho ID y asi vamos a tener llenos Los arrays platos de tipo PedidosPlatosDetalle y bebidas de tipo PedidosBebidasDetalle, POSTERIORMENTE SETEAMOS
COMO SE MUESTRA AQUI
pedidoSeleccionadao.setPedidosBebidasDetalle(bebidas);
pedidoSeleccionadao.setPedidosdetalle(platos);
Y de esta manera cuando se al objeto pedidoSeleccionadao.getPedidosdetalle().size(); y pedidoSeleccionadao.getPedidosBebidasDetalle().size(); podemos recuperar
el tamanio de dichos arrayList debido a que ya fueron llenos previamente, y asi el error org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
NO APARECE dejando funcionar la aplicacion correctamente.
*
*/
}
}
//----------------------------------------------------------------------------------------------------------------------
Solucion Del Del lado del EJB
//----------------------------------------------------------------------------------------------------------------------
@Stateless
public class TransaccionalEJBUno implements TransaccionalEJBUnoRemote {
@PersistenceContext
private EntityManager em;
public TransaccionalEJBUno() {
}
@Override
public List<Pedidos> getPedidosrealizadosBYMesero(String cedula) {
//Metodo que trae la informacion que el Mesero alla realizado
List<Pedidos> pedidos;
Query query = em.createQuery("Select pe From Pedidos pe where pe.usuarios.cedula=:cedula",Pedidos.class);
query.setParameter("cedula", cedula);
pedidos = query.getResultList();
return pedidos;
}
@Override
public List<PedidosPlatosDetalle> consultarPlatosDelPediodo(int idPedido) {
//En este metodo recuperamos todos los pedidos de platos detalle por medio del ID que le enviamos desde la vista
List<PedidosPlatosDetalle> platos;
Query query = em.createQuery("SELECT PLATO FROM PedidosPlatosDetalle PLATO WHERE PLATO.pedidos.id = :ID_PEDIDO", PedidosPlatosDetalle.class);
query.setParameter("ID_PEDIDO", idPedido);
platos = query.getResultList();
return platos;
}
@Override
public List<PedidosBebidasDetalle> consultarBebidasDelPediodo(int idPedido) {
//En este metodo recuperamos todos los pedidos de bebidas detalle por medio del ID que le enviamos desde la vista
List<PedidosBebidasDetalle> bebidas;
Query query = em.createQuery("SELECT BEBIDA FROM PedidosBebidasDetalle BEBIDA WHERE BEBIDA.pedidosDos.id = :ID_PEDIDO", PedidosBebidasDetalle.class);
query.setParameter("ID_PEDIDO", idPedido);
bebidas = query.getResultList();
return bebidas;
}
}
//----------------------------------------------------------------------------------------------------------------------
Resultado
//----------------------------------------------------------------------------------------------------------------------
Luego de realizar este cambio el error
org.hibernate.LazyInitializationException
desaparece//----------------------------------------------------------------------------------------------------------------------
Lo Sugerido
//----------------------------------------------------------------------------------------------------------------------
Lo sugerido es cambiar el tipo de relacionamiento como en la imagen previa para evitar asi problemas futuros, en este tipo de relacion la relacion OneToMany desde Pedidos hacia PedidosPLatosDetalle y PedidosBebidasDetalle no es necesaria, se planteo el problema anterior con una relacion OneToMany y la solucion adecuada con el fin si esta teniendo problemas similares puede retroalimentarse y dar solucion al problema que presente utilizando la logica de la solucion dada.
La forma rapida y no no recomendad para salirse de este tipo de problemas con el
org.hibernate.LazyInitializationException es colocando la entidad Pedidos asi:
public class Pedidos implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.AUTO)private int id;
@OneToMany(cascade=CascadeType.ALL,mappedBy="pedidos",fetch = FetchType.EAGER)
private List<PedidosPlatosDetalle> pedidosPlatosDetalle;
@OneToMany(cascade=CascadeType.ALL,mappedBy="pedidosDos",fetch=FetchType.EAGER)
private List<PedidosBebidasDetalle> pedidosBebidasDetalle;
}
Aclarando que el consumo de memoria de esta manera es grande y va a costar significativamente el rendimiento de nuestra aplicacion dependiendo del proyecto logicamente, lo ideal cuando se traen muchos datos es manejarlo con LAZY teniendo en cuenta que hay que trabajar mas para poder en muchos casos obtener el resultado como en este caso
Imagen del planteo de la situacion @OneToMany y @ManyTone
Imagen del planteo de la situacion sin Usar OneToMany, el cual en este caso ES LO SUGERIDO
No comments:
Post a Comment