[jboss-user] [EJB 3.0] - EJB3 PersistanceManager confusion

jrosskopf do-not-reply at jboss.com
Wed Sep 6 11:21:03 EDT 2006


Hello List,

I try to do my first steps with EJB3 and set up a small example persisting a detatched pojo entity (which is generated in a client) through a stateless session bean. 

I´ll attach the code of the three components at the end of the message.
When I invoke the the method, that should persist the entity I get the following exception:

  | Exception in thread "main" javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.toolsforjobs.j2ee.test.server.domain.Debtor
  | 	at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
  | 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
  | 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:225)
  | 	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
  | 	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
  | 	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
  | 	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
  | 	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
  | 	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:398)
  | 	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
  | 

But that is exactly what I´m wanting: Saving a detached entry ;-)
What I´m doing wrong?

Regards
---
Joachim

The Entity Bean

  | package com.toolsforjobs.j2ee.test.server.domain;
  | 
  | import java.io.Serializable;
  | 
  | import javax.persistence.CascadeType;
  | import javax.persistence.Entity;
  | import javax.persistence.GeneratedValue;
  | import javax.persistence.Id;
  | import javax.persistence.OneToOne;
  | import javax.persistence.Transient;
  | 
  | @Entity
  | public class Debtor implements Serializable{
  | 	@Transient
  | 	private static final long serialVersionUID = 3154162344396113561L;
  | 	
  | 	int id;
  | 	String idAtCustomer;
  | 	double balance;
  | 	
  | 	//Address address;
  | 	
  | 	/*
  | 	@OneToOne(cascade={CascadeType.ALL})
  | 	public Address getAddress() {
  | 		return address;
  | 	}
  | 	*/
  | 	public double getBalance() {
  | 		return balance;
  | 	}
  | 
  | 	@Id @GeneratedValue
  | 	public int getId() {
  | 		return id;
  | 	}
  | 	
  | 	public String getIdAtCustomer() {
  | 		return idAtCustomer;
  | 	}
  | 	/*
  | 	public void setAddress(Address address) {
  | 		this.address = address;
  | 	}
  | 	*/
  | 	public void setBalance(double balance) {
  | 		this.balance = balance;
  | 	}
  | 
  | 	public void setId(int id) {
  | 		this.id = id;
  | 	}
  | 
  | 	public void setIdAtCustomer(String idAtCustomer) {
  | 		this.idAtCustomer = idAtCustomer;
  | 	}
  | }
  | 

The Stateless Session Bean

  | package com.toolsforjobs.j2ee.test.server;
  | 
  | import javax.ejb.Stateless;
  | import javax.persistence.EntityManager;
  | import javax.persistence.PersistenceContext;
  | 
  | import com.toolsforjobs.j2ee.test.server.domain.Debtor;
  | 
  | @Stateless
  | public class DebtorAgentBean implements DebtorAgentRemote {
  | 
  | 	@PersistenceContext(unitName="tfj-dbs") EntityManager manager;
  | 	
  | 	public Debtor findDebtor(int id) {
  | 		return manager.find(Debtor.class, id);
  | 	}
  | 
  | 	public void saveDebtor(Debtor deb) {
  | 		manager.persist(deb);
  | 	}
  | 
  | }
  | 

And the calling client

  | package com.toolsforjobs.j2ee.test.client;
  | 
  | import javax.naming.Context;
  | import javax.rmi.PortableRemoteObject;
  | 
  | import com.toolsforjobs.j2ee.test.server.DebtorAgentRemote;
  | import com.toolsforjobs.j2ee.test.server.domain.Address;
  | import com.toolsforjobs.j2ee.test.server.domain.Debtor;
  | 
  | public class DebtorClient {
  | 	public static void main(String[] args) {
  | 		try {
  | 			Context jndiContext = getInitialContext();
  | 			Object ref = jndiContext.lookup("DebtorAgentBean/remote");
  | 			DebtorAgentRemote dao = (DebtorAgentRemote) PortableRemoteObject.narrow(ref, DebtorAgentRemote.class);
  | 			
  | 			Debtor deb1 = new Debtor();
  | 			deb1.setId(1);
  | 			deb1.setBalance(100.0d);
  | 			deb1.setIdAtCustomer("toolsforjobs");
  | 
  | 			dao.saveDebtor(deb1);
  | 		} catch (javax.naming.NamingException ne) {
  | 			ne.printStackTrace();
  | 		}
  | 	}
  | 
  | 	public static Context getInitialContext()  throws javax.naming.NamingException {
  | 		return new javax.naming.InitialContext();
  | 	}
  | }
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3969771#3969771

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3969771




More information about the jboss-user mailing list