[jboss-user] [EJB 3.0] - Problem with containment interacting with inheritance?
knaveofhearts
do-not-reply at jboss.com
Wed Jul 12 21:13:56 EDT 2006
I posted the following yesterday to the "O'Reilly EJB 3.0 Workbook." I chose that forum because the question was motivated by the book, but there is obviously more activity here, and the post has gotten no replies there. I still don't see what is wrong with what I did. The database is HSQLDB, configured as in the workbook examples.
-----------------------------------
I am missing something fundamental about transactions and the discussion of entity relationships in ch. 7 combined with inheritence, as in ch. 8. There are a client, a stateless session bean, and 3 entities: GeopolUnit, Planet, and Country. Planet and Country both inherit from GeopolUnit. Planet is supposed to contain a list of countries, in a one-to-many unidirectional relationship. In the client, I can create a planet and a country separately. But when I try to create the planet already containing a country by un-commenting the "planet.add(country);" line in the client code listing below, I get the error. I have tried various combinations of putting methods into transactions and flushing things, but so far have been unsuccessful. (I think I ought to be able to omit the "createCountry" call in the client because of the cascade PERSIST constraint, but I get the same kind of error regardless of whether that call is in or out.)
Any help is appreciated.
K/H
[java] Exception in thread "main" java.lang.RuntimeException: org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[Forma tId=257, GlobalId=mulder.vorticityCorp.com/24, BranchQual=, localId=24] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.persistence.PersistenceEx ception: org.hibernate.TransientObjectException: com.ejbWB.geopolUnit.Country)
| [java] at org.jboss.aspects.tx.TxPolicy.handleEndTransactionException(TxPolicy.java:198)
| [java] at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:180)
| [java] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
| [java] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:225)
| [java] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
| [java] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
| [java] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
| [java] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412)
| [java] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
| [java] Caused by: org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=mulder.vorticityCorp.com/2 4, BranchQual=, localId=24] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.persistence.PersistenceException: org.hibernate.TransientObjectExcept ion: com.ejbWB.geopolUnit.Country)
| [java] at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:372)
| [java] at org.jboss.tm.TxManager.commit(TxManager.java:240)
| [java] at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
| [java] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
| [java] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:225)
| [java] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
| [java] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
| [java] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
| [java] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412)
| [java] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
| [java] at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:190)
| [java] at org.jboss.remoting.Client.invoke(Client.java:525)
| [java] at org.jboss.remoting.Client.invoke(Client.java:488)
| [java] at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:55)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:55)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:65)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
| [java] at $Proxy0.createPlanet(Unknown Source)
| [java] at com.ejbWB.clients.Client.main(Client.java:22)
| [java] Caused by: javax.persistence.PersistenceException: org.hibernate.TransientObjectException: com.ejbWB.geopolUnit.Country
| [java] at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:567)
| [java] at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:484)
| [java] at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491)
| [java] at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110)
| [java] at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
| [java] at org.jboss.tm.TxManager.commit(TxManager.java:240)
| [java] at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
| [java] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
| [java] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
| [java] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
| [java] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:225)
| [java] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
| [java] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
| [java] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
| [java] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
| [java] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412)
| [java] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
| [java] Caused by: org.hibernate.TransientObjectException: com.ejbWB.geopolUnit.Country
| [java] at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
| [java] at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
| [java] at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:71)
| [java] at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:732)
| [java] at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1080)
| [java] at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
| [java] at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
| [java] at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
| [java] at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
| [java] at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
| [java] at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
| [java] at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
| [java] at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:340)
| [java] at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:475)
|
The client:
| package com.ejbWB.clients;
|
| import com.ejbWB.admin.AdminRemote;
| import com.ejbWB.geopolUnit.*;
| import javax.naming.*;
| import javax.rmi.PortableRemoteObject;
|
| public class Client
| {
| public static void main(String [] args) {
| try {
| Context jndiContext = getInitialContext();
| Object ref = jndiContext.lookup("AdminBean/remote");
| AdminRemote admin = (AdminRemote)ref;
| Planet planet = new Planet();
| Country country = new Country("Italy");
| long c_id = admin.createCountry(country);
| System.out.println("country id=" + c_id);
| //planet.add(country);
| long p_id = admin.createPlanet(planet);
| System.out.println("planet id=" + p_id);
| }
| catch (javax.naming.NamingException ne) {
| ne.printStackTrace();
| }
| }
| public static Context getInitialContext()
| throws javax.naming.NamingException {
| return new javax.naming.InitialContext();
| }
| }
The session bean:
| package com.ejbWB.admin;
| import javax.ejb.*;
| import javax.persistence.*;
| import java.util.*;
| import com.ejbWB.geopolUnit.*;
|
| @Stateless
| public class AdminBean implements AdminRemote
| {
| @PersistenceContext(unitName="ejbWB") private EntityManager manager;
|
| public long createPlanet(Planet planet) {
| manager.persist(planet);
| return planet.getId();
| }
| public long createCountry(Country country) {
| manager.persist(country);
| return country.getId();
| }
| /* I WOULD LIKE TO BE ABLE TO HAVE THIS METHOD WORK
| public Planet findPlanet(long pKey) {
| Planet planet = manager.find(Planet.class, pKey);
| List<Country> countries = planet.getCountries();
| Iterator iter = countries.iterator();
| while (iter.hasNext()) {
| Country c = (Country)iter.next();
| String name = c.getName();
| }
| return planet;
| }
| */
| }[size]
The remote interface is obvious and is omitted.
The three entities:
package com.ejbWB.geopolUnit;
| import javax.persistence.*;
|
| @Entity
| @Inheritance(strategy=InheritanceType.JOINED)
| public abstract class GeopolUnit implements java.io.Serializable {
| public GeopolUnit(String name) { setName(name); }
|
| @Id
| @GeneratedValue
| public long getId() { return id; }
| public void setId(long id) { this.id = id; }
|
| @Column(nullable=false)
| public String getName() { return name; }
| public void setName(String name) { this.name = new String(name); }
|
| private String name;
| private long id;
| }
| //--------------
| package com.ejbWB.geopolUnit;
| import javax.persistence.*;
| import java.util.List;
| import java.util.LinkedList;
|
| @Entity
| public class Planet extends GeopolUnit implements java.io.Serializable {
| public Planet() { super("Earth"); }
| public void add(Country country) { countries.add(country); }
|
| @OneToMany(cascade={CascadeType.PERSIST})
| @OrderBy("name ASC")
| public List<Country> getCountries() { return countries; }
| public void setCountries(List<Country> countries) { this.countries = countries; }
|
| private List<Country> countries = new LinkedList<Country>();
| }
| //--------------
| package com.ejbWB.geopolUnit;
| import javax.persistence.*;
|
| @Entity
| public class Country extends GeopolUnit implements java.io.Serializable {
| public Country(String name) { super(name); }
| }
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3957593#3957593
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3957593
More information about the jboss-user
mailing list