2014-12-08 4 views
0

저는 RMI 기반 마켓 플레이스가있는 프로젝트에서 작업 중이며 시장에서 데이터를 저장하는 데이터베이스를 추가하고 있습니다.RollbackException의 원인을 찾는 방법은 무엇입니까?

"상품"을 클라이언트에서 판매하려고 할 때 "시장"(서버)에서 "putItemOnSale"이라는 원격 메소드를 호출하면 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); 
    } 
} 

Item 클래스 : 다음은 관련 메소드의 코드와 항목 클래스입니다

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

아이템을 판매하는 것을 시도하기 전에, 나는 클라이언트에서 상인을 등록 관리는 그것은 추가 예외없이 데이터베이스에 저장됩니다. 여기에 내가 얻은 예외의 전체 스택 추적이 있습니다. 누구든지이 예외가 발생하는 이유를 찾는 방법에 대한 아이디어가 있습니까? 난 당신이에서 트랜잭션을 커밋하는 방법 ... 문제에서 유래하지만, 예외가 최대한 빨리이 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에 대해 이야기 했으므로 아마도 "strictfp"라는 자바 키워드를 사용해야합니다. –

답변

0

참고 시도 finally 절 (commitTransaction() 메서드의 이름이 잘못 지정되었다고 가정) : 예외가 발생하고 트랜잭션을 롤백해야하는 경우에도 코드가 트랜잭션을 항상 커밋하려고 시도합니다.

실제 문제는 다음과 같습니다. 이전 예외의 결과 인 finally 절 안에 예외가 발생하여 이전 예외가 표시되지 않습니다.

트랜잭션이 롤백으로 표시되었는지 확인하려면 해당 commitTransaction() 메소드에 체크를 추가해야합니다. 커밋되지 않은 경우 롤백을 수행하십시오.

관련 문제