2014-12-08 2 views
0

Я работаю над проектом, где у меня база данных на основе RMI, и я добавляю базу данных для сохранения данных с рынка.Как найти причину исключения RollbackException?

Когда я пытаюсь поместить «товар» в продажу у клиента, я вызываю удаленный метод «putItemOnSale» с «market» (server), и я получаю javax.persistence.RollbackException. Вот код соответствующего метода и класс пункта:

@Override 
public void putItemOnSale(String name, String trader, Float price) throws RemoteException, RejectedException { 
    EntityTransaction transaction = null; 
    try { 
     transaction = beginTransaction(); 
     List<ItemImpl> existingItems = em.createNamedQuery("findItemsWithName", ItemImpl.class). 
       setParameter("name", name).getResultList(); 
     if (!existingItems.isEmpty()) { 
      // item already existing, error 
      throw new RejectedException("Rejected: Item with name : " + name + " already exists"); 
     } 
     List<TraderImpl> existingTraders = em.createNamedQuery("findTraderWithName",TraderImpl.class). 
       setParameter("ownername",trader).getResultList(); 

     if (existingTraders.isEmpty()){ 
      throw new RejectedException("Rejected : Trader not registered"); 
     } 

     // create Item. 
     ItemImpl item = new ItemImpl(name,existingTraders.get(0),price); 
     em.persist(item); 

    } 
    finally { 
     commitTransaction(transaction); 
    } 
} 

Пункта Класс:

public class ItemImpl extends UnicastRemoteObject implements Item, Serializable 
{ 
    @Id 
    @Column(name = "id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long ItemId; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne 
    private TraderImpl owner; 

    @Column(name = "price") 
    private Float price; 
... 
} 

Прежде чем пытаться продать товар, мне удалось зарегистрировать трейдер от клиента, и он будет добавлен в базу данных без каких-либо исключений. Вот полная stacktrace исключения, которое я получаю, это не совсем явное для меня. Кто-нибудь есть идея о том, как найти, почему это исключение происходит? Я пытался добавить точку останова, чтобы увидеть более точно, где проблема приходит, но исключение происходит, как только я пытаюсь уйти в метод PutItemOnSale ...

Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly. 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:141) 
    at marketplace.MarketPlaceImpl.commitTransaction(MarketPlaceImpl.java:351) 
    at marketplace.MarketPlaceImpl.putItemOnSale(MarketPlaceImpl.java:181) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) 
    at com.sun.proxy.$Proxy6.putItemOnSale(Unknown Source) 
    at client.ClientForm.sellButtonActionPerformed(ClientForm.java:1007) 
    at client.ClientForm.access$200(ClientForm.java:31) 
    at client.ClientForm$4.actionPerformed(ClientForm.java:321) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:688) 
    at java.awt.EventQueue$3.run(EventQueue.java:686) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:702) 
    at java.awt.EventQueue$4.run(EventQueue.java:700) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+0

RMI на самом деле не имеет никакого отношения к этому. – EJP

+0

Вам следует избегать поплавка и двойное. И теперь, когда вы говорите о RMI, вы должны, вероятно, использовать Google ключевое слово «strictfp». –

ответ

0

Обратите внимание, как вы совершаете сделку в finally (предполагая, что метод commitTransaction() на самом деле плохо назван): это означает, что ваш код будет пытаться ВСЕГДА совершить транзакцию, даже когда происходит исключение, и транзакция должна быть отброшена.

Итак, ваша настоящая проблема: вы отключаете исключение внутри предложения finally, которое является результатом более раннего исключения, тем самым делая невидимым ранее исключение.

Возможно, вы должны добавить проверку этому методу commitTransaction(), чтобы убедиться, что транзакция отмечена для отката - и если да, выполните откат, а не коммит.

Смежные вопросы