problemas con hibernate

175 views
Skip to first unread message

Ozkar

unread,
Nov 4, 2010, 4:42:04 PM11/4/10
to JavaSOS
Hola viejos!!!

Muchos se van a enojar por este post, pero ni modo!!!

tengo una aplicación en la que uso hibernate, en un programa en
especial, donde guardo un objeto que tiene varias colecciones y está
compuesto de varios objetos tengo muchos problemas al intentar
guardarlos en base de datos, ya sea el error con un objeto transient o
el que dice que está en dos sesiones, la cosa es muy inconsistente en
su funcionamiento. Ya utilicé save, saveupdate, merge, la cosa es que
ninguno funciona al 100%, ya lei el manual de la pagina de hibernate,
lo busqué en google, pero siguió igual.

La verdad pienso que hago las cosas mal entonces ahí va en resumidas
cuentas.

1.- abro sesión con hibernate
2.- cargo el objeto con todo y lo que contenga según el mapeo.
3.- cierro sesión.

4.- modifico los objetos, agrego a las colecciones nuevos objetos,
modifico algunos, elimino otros, etc.

5.- abro sesión con hibernate.
6.- "INTENTO" salvar, ya sea con save, saveupdate o merge. //Aquí es
donde generalmente las cosas fallan, es un objeto bien grande
7.- cierro sesión


¿Está mal?,¿alguien tiene algún programa ejemplo que pueda usar? para
darme una mejor idea...

Gracias.

christia...@gmail.com

unread,
Nov 4, 2010, 4:47:20 PM11/4/10
to jav...@googlegroups.com

Q error sale?
Deja que hibernate abra y cierre la conexión.


--
www.JavaSOS.com
Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.

Ozkar

unread,
Nov 4, 2010, 4:58:45 PM11/4/10
to JavaSOS
como es eso de que hibernate abra y cierre la conexión???

te digo algo, en ocasiones hay veces que no manda error, simplemente
no lo hace, voy a generar las trazas de error para pegarlas aquí.

gracias.


On 4 nov, 14:47, "christian.kom...@gmail.com"
<christian.kom...@gmail.com> wrote:
> Q error sale?
> Deja que hibernate abra y cierre la conexión.
>

Ozkar

unread,
Nov 4, 2010, 6:07:19 PM11/4/10
to JavaSOS

Este es el error que mas me lanza, por lo mismo en el código puse que
si no podía salvarlo con saveupdate, lo hiciera con merge y por eso
los mensajes

INFO: TRANSACCION TERMINADA EN UPDATE
GRAVE: org.hibernate.HibernateException: Illegal attempt to associate
a collection with two open sessions
at
org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:
410)
at
org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:
43)
at
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:
101)
at
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:
61)
at
org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:
55)
at
org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:
123)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:
293)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:
223)
at
org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:
33)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:
70)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:
564)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
at
ALGOSA.CTRL.Pedimento.BeanFiltroP.actualizaExtraccion(BeanFiltroP.java:
3616)
at
ALGOSA.CTRL.Pedimento.BeanFiltroP.actualizaPedimentoExtraccion(BeanFiltroP.java:
6013)
at
ALGOSA.CTRL.Pedimento.BeanFiltroP.generarArchivoM(BeanFiltroP.java:
5509)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(AstValue.java:187)
at
com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at
com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:
68)
at
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:
88)
at
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:
102)
at javax.faces.component.UICommand.broadcast(UICommand.java:
387)
at
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
at
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:
756)
at
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:
82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at
com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:
18)
at
com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCycle(ReceiveSendUpdates.java:
132)
at
com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:
74)
at
com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:
31)
at
com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:
24)
at
com.icesoft.faces.webapp.http.servlet.BasicAdaptingServlet.service(BasicAdaptingServlet.java:
16)
at
com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:
23)
at
com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:
53)
at
com.icesoft.faces.webapp.http.servlet.SessionVerifier.service(SessionVerifier.java:
26)
at
com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:
23)
at
com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:
131)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
847)
at
com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:
56)
at
org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:
431)
at
org.apache.catalina.core.StandardWrapperValve.preInvoke(StandardWrapperValve.java:
462)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
139)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
186)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
719)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
657)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:
96)
at
com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:
98)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
187)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
719)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
657)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
651)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
142)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
719)
at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:
657)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
651)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
at
org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:
325)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
242)
at
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:
180)
at
com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:
633)
at
com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:
570)
at
com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:
827)
at
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:
152)
at
com.sun.enterprise.v3.services.impl.GlassfishProtocolChain.executeProtocolFilter(GlassfishProtocolChain.java:
71)
at
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:
103)
at
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:
89)
at
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:
76)
at
com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:
67)
at
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:
56)
at
com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:
325)
at
com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184)
INFO: Error en SAVEUPDATE
INFO: ROLLBACK EJECUTADO SAVEUPDATE
INFO: TRANSACCION TERMINADA EN MERGE

Gabriel Volpe

unread,
Nov 4, 2010, 6:35:46 PM11/4/10
to jav...@googlegroups.com
Te está diciendo claramente que tiene conflictos porque hay dos sesiones abiertas, deberías tener un Session Factory que sea Singleton y le pedís el objeto session cada vez que lo necesites.

Si trabajás solo con Hibernate en la página oficial dice como crear una clase HibernateUtil Singleton (http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/). Es el siguiente:

package hello;

import org.hibernate.*;
import org.hibernate.cfg.*;
import test.*;
import test.animals.Dog;

public class HibernateUtil {

private static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new AnnotationConfiguration()
                    .configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log exception!
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession()
            throws HibernateException {
        return sessionFactory.openSession();
    }
}
      

Si lo integras con Spring deberías definir un bean para el Session Factory.

Slds!


Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.



--
              Volpe Gabriel
 
Duke 'n' Tux - Java & Linux 4 Life


Ozkar

unread,
Nov 4, 2010, 7:15:31 PM11/4/10
to JavaSOS
ya tengo esa clase, trabajo solo con hibernate y precisamente le piso
la sesión cada que voy a hacer algo en la base de datos, en este caso
guardar la información.

Mi problema no es no entender el error, si no evitar no tener las dos
sesiones abiertas. porque según yo siempre que abro también cierro la
sesión que usé



On 4 nov, 16:35, Gabriel Volpe <volpegabr...@gmail.com> wrote:
> Te está diciendo claramente que tiene conflictos porque hay dos sesiones
> abiertas, deberías tener un Session Factory que sea Singleton y le pedís el
> objeto session cada vez que lo necesites.
>
> Si trabajás solo con Hibernate en la página oficial dice como crear una
> clase HibernateUtil Singleton (http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_sin...).
> Es el siguiente:
>
> package hello;
> import org.hibernate.*;import org.hibernate.cfg.*;import test.*;import
> test.animals.Dog;
> public class HibernateUtil {
> private static final SessionFactory sessionFactory;    static {
> try {            sessionFactory = new AnnotationConfiguration()
>             .configure().buildSessionFactory();        } catch
> (Throwable ex) {            // Log exception!            throw new
> ExceptionInInitializerError(ex);        }    }
>     public static Session getSession()            throws
> HibernateException {        return sessionFactory.openSession();    }}
>
> Si lo integras con Spring deberías definir un bean para el Session Factory.
>
> Slds!
>
> ...
>
> leer más »

Jorge Medina

unread,
Nov 4, 2010, 11:57:42 PM11/4/10
to jav...@googlegroups.com
Yo creo que todavía no has entendido como trabaja Hibernate.
La sesión es un concepto distinto a la conexion. (Una conexión
representa un canal de comunicación hacia la base de datos, mientras
que una sesión agrupa un conjunto de oepraciones a realizar )
Yo veo a la sesión como un "buffer" de instrucciones SQL. Estas son
ejecutadas hasta que la session se cierra - o de manera parcial cuando
ejecutas un save() o saveOrUpdate() o flush().

Una sesión de Hibernate mantiene control de los objetos que has leido
y modificado y estos son persistidos (guardados) al momento de cerrar
la sesión. En general yo uso una sesión por transacción.

1.- abro sesión con hibernate

2.- cargo objeto(s)
3.- modifico los objetos
4.- cierro sesión

En general no hay necesidad de salvar los objetos. Hibernate los salva
automaticamente al cerrar la sesión.
Sin embargo, hay ciertos casos en los que tienes que salvar ciertos
objetos para que otra operación los pueda ver dentro de la misma
transacción.

Por ejemplo, si creas un objeto A esto se traducirá en un INSERT, pero
este INSERT podria no ser ejecutado hasta que la sesión termine. Pero
si tu necesitas crear un objecto B que depende de A (por ejemplo, de
su llave primaria autogenerada), entonces el INSERT debe ocurrir antes
de que puedas completar tu objeto B. En este caso, pudes salvar A o
hacer un flush() de la sesión.

Yo veo a la sesión como un "buffer" de instrucciones SQL. Estas son
ejecutadas hasta que la session se cierra - o de manera parcial cuando
ejecutas un save() o saveOrUpdate() o flush().

Los objetos que obtienes mediante una sesión estas asociados
(attached) a la sesión. Una vez que la sesión es cerrada estos
objectos son considerados "sin asociación" (dettached).
Hibernate te permite realizar cambios a objectos sin asociación, pero
para que estos surtan efecto primero tienes que asociarlos nuevamente
con una sesion:

1.- abro sesión con hibernate

2.- cargo objeto(s)
3. cierro ssión
4.- modifico los objetos
5.- abro sesion
6.- asocio objectos con nueva sesion
7.- cierro sesion

Sin embargo, esta forma de trabajar con Hibernate no la encuentro yo
muy recomendable.


2010/11/4 Ozkar <ozk...@gmail.com>:

Ozkar

unread,
Nov 5, 2010, 3:07:40 AM11/5/10
to JavaSOS

Ok, entonces efectivamente no lo había entendido, voy a arreglar mi
programa para que trabaje en la forma que me recomiendas.

muchas gracias en verdad, por tu clara explicación.
> 2010/11/4 Ozkar <ozka...@gmail.com>:> ya tengo esa clase, trabajo solo con hibernate y precisamente le piso

Ozkar

unread,
Nov 5, 2010, 10:29:58 AM11/5/10
to JavaSOS
otra pregunta...


¿no importa el tiempo que esté abierta la sesión?

por eso hacemos el save, saveupdate, etc, cada que terminamos una
transacción para mantener la base actualizada en caso de que el
usuario se cuelgue, o se mueva y olvide su sesión en el sistema, cosas
así.

¿es correcto?
> ...
>
> leer más »

Jorge Medina

unread,
Nov 15, 2010, 9:25:50 AM11/15/10
to jav...@googlegroups.com
save o saveOrUpdate no tienen efecto si estas en una session abierta
con session.beginTransaction()
Los otros usuarios tampoco veran los cambios hasta que la transaction
es "commited" o "rolled back"


2010/11/5 Ozkar <ozk...@gmail.com>:

Jorge Medina

unread,
Nov 15, 2010, 9:26:23 AM11/15/10
to jav...@googlegroups.com
Oh mejor dicho, su efecto es local (a la sesion misma),

2010/11/15 Jorge Medina <cerebrote...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages