[hibernate-issues] [Hibernate-JIRA] Commented: (EJB-235) [ClassCastException] problem with merge() for abstract entity

Antonel Pazargic (JIRA) noreply at atlassian.com
Thu Oct 5 04:05:24 EDT 2006


    [ http://opensource.atlassian.com/projects/hibernate/browse/EJB-235?page=comments#action_24727 ] 

Antonel Pazargic commented on EJB-235:
--------------------------------------

Unit tests:

package test;

import javax.naming.Context;
import javax.naming.InitialContext;

import org.junit.*;

import com.titan.services.TitanService;

import ro.iqbyte.arhimed.model.core.common.entities.adm.*;
import ro.iqbyte.arhimed.model.core.common.entities.adm.Individual.Gender;

public class MergeTest {

	Context ctx;
	TitanService ts;

	@Before
	public void setUp() throws Exception {
		ctx = new InitialContext();
		ts = (TitanService) ctx.lookup("TitanServiceBean/remote"); //$NON-NLS-1$
	}

	@After
	public void tearDown() throws Exception {
		ctx.close();
	}

	@Test
//	@Ignore
	public void saveTest() {
		insertUsers();
	}

	@Test
//	@Ignore
	public void mergeTest() {
		MedicalPersonnel mp = ts.findMedicalPersonnelBySsn("1112"); //$NON-NLS-1$
		mp = ts.mergeMedicalPersonnel(mp);
		if (mp instanceof Nurse) {
			Nurse nurse = (Nurse) mp;
			System.out.println("Nurse full name = " + nurse.getFullName()); //$NON-NLS-1$
		}
		if (mp instanceof Physician) {
			Physician physician = (Physician) mp;
			System.out.println("Physician full name = " + physician.getFullName()); //$NON-NLS-1$
		}
	}

	private void insertUsers() {
		Nurse nurse2 = new Nurse("1112", "Nurse2", "Nurse2"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
		nurse2.setGender(Gender.FEMALE);
		Physician physician2 = new Physician("1122", "Physician2", "Physician2");//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
		physician2.setGender(Gender.MALE);
		MedicalDoc medDoc1 = new MedicalDoc("1111"); //$NON-NLS-1$
		MedicalDoc medDoc2 = new MedicalDoc("1112"); //$NON-NLS-1$
		nurse2.addMedicalDoc(medDoc1);
		nurse2.addMedicalDoc(medDoc2);
		MedicalDoc medDoc3 = new MedicalDoc("1113"); //$NON-NLS-1$
		MedicalDoc medDoc4 = new MedicalDoc("1114"); //$NON-NLS-1$
		physician2.addMedicalDoc(medDoc3);
		physician2.addMedicalDoc(medDoc4);
		User userNurse2 = new User("userNurse112", "userNurse112", nurse2); //$NON-NLS-1$ //$NON-NLS-2$
		User userPhysician2 = new User("userPhysician112", "userPhysician112", physician2); //$NON-NLS-1$//$NON-NLS-2$
		ts.saveUser(userNurse2);
		ts.saveUser(userPhysician2);
	}

I'll hope these helps.

}


@Stateless
public class TitanServiceBean implements TitanService{ 
...
	public void saveUser(User user) {
		em.persist(user.getMedicalPersonnel());
		em.persist(user);
	}

	public MedicalPersonnel findMedicalPersonnelBySsn(String ssn) {
		Query qry = em.createQuery("FROM MedicalPersonnel mp WHERE mp.ssn = :ssn"); //$NON-NLS-1$
		qry.setParameter("ssn", ssn); //$NON-NLS-1$
		return (MedicalPersonnel) qry.getSingleResult();
	}

	public MedicalPersonnel mergeMedicalPersonnel(MedicalPersonnel mp) {
		return em.merge(mp);
	}
...
}

> [ClassCastException] problem with merge() for abstract entity
> -------------------------------------------------------------
>
>          Key: EJB-235
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/EJB-235
>      Project: Hibernate Entity Manager
>         Type: Bug

>   Components: EntityManager
>     Versions: 3.2.0.cr2
>  Environment: WinXP SP2, EJB3.0 Embeddable Server Alpha 9 and JBoss AS 4.0.4 GA, Java 1.5.0_09, PostgreSQL 8.1
>     Reporter: Antonel Pazargic

>
>
> I have the following hierarchy of entities 
> MedicalPersonnel (abstract class) (InheritanceType.JOINED) 
> >--- Nurse (concret class) 
> >--- Physician (concrett class) 
> and relation 
> MedicalPersonnel (OneToMany) MedicalDoc 
> When I've tried 
> MedicalPersonnel mp; 
> /* get a persisted and detached instance of MedicalPersonnel and assign with mp */ 
> mp = em.merge(mp); //ClassCastException
> Error stack trace:
> Exception in thread "main" javax.ejb.EJBException: java.lang.ClassCastException: ro.iqbyte.arhimed.model.core.common.entities.adm.Nurse 
> 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:227) 
> 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:412) 
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239) 
> Caused by: java.lang.ClassCastException: ro.iqbyte.arhimed.model.core.common.entities.adm.Nurse 
> at org.hibernate.type.LongType.set(LongType.java:42) 
> at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:83) 
> at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:65) 
> at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1514) 
> at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1576) 
> at org.hibernate.loader.Loader.doQuery(Loader.java:661) 
> at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224) 
> at org.hibernate.loader.Loader.loadEntity(Loader.java:1785) 
> at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48) 
> at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:85) 
> at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1565) 
> at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:365) 
> at org.hibernate.type.EntityType.resolve(EntityType.java:306) 
> at org.hibernate.type.EntityType.replace(EntityType.java:207) 
> at org.hibernate.type.TypeFactory.replace(TypeFactory.java:431) 
> at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:282) 
> at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:246) 
> at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:99) 
> at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:51) 
> at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:679) 
> at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:663) 
> at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:667) 
> at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:201) 
> at org.jboss.ejb3.entity.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:181) 
> at com.titan.services.TitanServiceBean.visitNurse(TitanServiceBean.java:122) 
> at com.titan.services.TitanServiceBean.visitMedicalPersonnel(TitanServiceBean.java:116) 
> 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:585) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 
> at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 
> at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
> at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
> at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
> at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 
> 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:227) 
> 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:412) 
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239) 
> at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:190) 
> at org.jboss.remoting.Client.invoke(Client.java:525) 
> at org.jboss.remoting.Client.invoke(Client.java:488) 
> at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) 
> at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:46) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) 
> at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:40) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) 
> at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:78) 
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) 
> at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102) 
> at $Proxy0.visitMedicalPersonnel(Unknown Source) 
> at ro.iqbyte.arhimed.model.teste.Main.visitMedicalPersonnel(Main.java:196) 
> at ro.iqbyte.arhimed.model.teste.Main.main(Main.java:71)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list