JPA - problem z operacja na encjach

0

Witam

Mam program dzialajacy na bazie danych z wykorzystaniem JPA. Modyfikacja, usuwanie i dodawanie encji dziala prawidlowo. Zauwazylem jednak problem z rekordami w tabelach ktore posiadaja id=0. Nie moge ich ani edytowac ani usunac. A gdy prubuje to zrobic dostaje taki wyjatek:

2009-12-02 21:01:24 com.sun.enterprise.appclient.MainWithModuleSupport <init>
WARNING: ACC003: Application threw an exception.
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
        javax.transaction.RollbackException: Transaction marked for rollback.
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
        javax.transaction.RollbackException: Transaction marked for rollback.
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:243)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at postservice.ejb.__MainServiceRemote_Remote_DynamicStub.processBannedList(postservice/ejb/__MainServiceRemote_Remote_DynamicStub.java)
        at postservice.ejb._MainServiceRemote_Wrapper.processBannedList(postservice/ejb/_MainServiceRemote_Wrapper.java)
        at postservice2.Main.doLogin(Main.java:66)
        at postservice2.Main.main(Main.java:41)
        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.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
        at com.sun.enterprise.appclient.Main.main(Main.java:200)
Caused by: java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
        javax.transaction.RollbackException: Transaction marked for rollback.
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:251)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1411)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy449.processBannedList(Unknown Source)
        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.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
        at com.sun.enterprise.distributedtx.J2EETransaction.commit(J2EETransaction.java:449)
        at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:371)
        at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3817)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3596)
        at com.sun.ejb.containers.StatefulSessionContainer.postInvokeTx(StatefulSessionContainer.java:2714)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1379)
        ... 19 more
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
        javax.transaction.RollbackException: Transaction marked for rollback.
        at postservice.ejb._MainServiceRemote_Wrapper.processBannedList(postservice/ejb/_MainServiceRemote_Wrapper.java)
        at postservice2.Main.doLogin(Main.java:66)
        at postservice2.Main.main(Main.java:41)
        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.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
        at com.sun.enterprise.appclient.Main.main(Main.java:200)
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:461)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
        at com.sun.enterprise.appclient.Main.main(Main.java:200)
Caused by: java.lang.reflect.InvocationTargetException
        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.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
        ... 2 more
Caused by: javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
        javax.transaction.RollbackException: Transaction marked for rollback.
        at postservice.ejb._MainServiceRemote_Wrapper.processBannedList(postservice/ejb/_MainServiceRemote_Wrapper.java)
        at postservice2.Main.doLogin(Main.java:66)
        at postservice2.Main.main(Main.java:41)
        ... 8 more
Java Result: 1

Niestety za duzo mi to nie mowi.
Prosilbym o jakies wyjasnienie dlaczego tak sie dzieje i jak temu zaradzic.

0

Juz wiem co bylo przyczyna.
Ze wzgledow bezpieczenstwa uzylem funkcji (zamiast Address powinno byc BannedList ale tamta juz zmienilem):

    private Address getAddress(int id){
        Address add = null;
        Collection coll = su.getAddressCollection();
        Iterator it = coll.iterator();
        while(it.hasNext()){
            add = (Address)it.next();

            if(add.getIdaddress().intValue() == id){
                return add;
            }
        }

        return null;
    }

Zmienna su reprezentuje obiekt klasy UserService ktory jako kolekcje posiada miedzy innymi BannedList.
W swoim programie zrobilem tak, ze po podaniu id, funkcja pobiera kolekcje i sprawdza czy istnieje w niej dana encja. Jesli istnieje, to jest zwracana jesli nie to jest zwracany null.
Nastepnie inna funkcja wywoluje EntityManager.remove(encja); Niestety to nie dzialalo, wiec zastosowalem remove(merge(encja). Ale tez nie zadzialalo bo wywalalo wyjatek ktory juz przedstawilem.
Od tej pory sprawdzam tylko czy dana encja znajduje sie w kolekcji a nastepnie wywoluje metode EntityManager.find(BannedList.class, id); i zwrocony obiekt przekazuje metodzie remove().
Ta wersja dziala. Ale nie rozumiem dlaczego wczesniejsza nie dzialala skoro logicznie rzecz biorac obydwie metody odwoluja sie do tego samego rekordu w bazie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1