Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] EntityManager.find returning instance of wrong type

If I've understood correctly, when the DiscriminatorColumn annotation is
missing JPA defaults to DTYPE (with values corresponding to the entity
name). Just to be sure I tried adding the DiscriminatorColumn annotation to
the Base class and DiscriminatorValue annotations to the subclasses (I had
already moved the Inheritance from the deriving clases to the Base class)
but it made no difference: the problem persists. 



Zarar Siddiqi wrote:
> 
> How would JPA know what row coincides with what subclass?  To tell it
> that you'll need to use the @DiscriminatorColumn on the parent class
> and supply a unique value for each subclass using the
> @DiscriminatorValue for the subclasses.
> 
> Also, the @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
> annotation goes on the parent class.
> 
> Zarar
> 
> 
> On Fri, Mar 6, 2009 at 8:52 AM, jsw <marvin.438@xxxxxxxxx> wrote:
>>
>> In my REST service:
>>
>>  public void doTest() {
>>        long id = 12; // valid id of Bar entity
>>
>>        List<Base> bases = this.facade.getDAO().findAllBase();
>>
>>        Base base = null;
>>        try {
>>            if ((base = this.facade.getWorkOrderDAO().findFooById(id)) !=
>> null) { // this row will throw an exception
>>                log.debug("Found Foo");
>>            } else if ((base =
>> this.facade.getWorkOrderDAO().findBarById(id)) != null) {
>>                log.debug("Found Bar");
>>            }
>>
>>        } catch (Exception ex) {
>>            ex.printStackTrace();
>>        }
>>  }
>>
>> And in the DAO class:
>>
>>    @Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
>>    public List<Base> findAllBase() {
>>        return em.createQuery("select b from Base b").getResultList();
>>    }
>>
>>    @Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
>>    public Foo findFooById(long id) {
>>        return em.find(Foo.class, id);
>>    }
>>
>>    @Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
>>    public Bar findBarById(long id) {
>>        return em.find(Bar.class, id);
>>    }
>>
>> java.lang.ClassCastException: com.acme.planning.dataaccess.model.Bar
>> cannot
>> be cast to com.acme.planning.dataaccess.model.Foo
>>     at com.acme.planning.dataaccess.DAO.findFooById(DAO.java:348)
>>     at
>> com.acme.planning.dataaccess.DAO$$FastClassByCGLIB$$80c0e135.invoke(<generated>)
>>     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
>>     at
>> org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
>>     at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
>>     at
>> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
>>     at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
>>     at
>> org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
>>     at
>> com.acme.planning.dataaccess.DAO$$EnhancerByCGLIB$$93a24725.findFooById(<generated>)
>>     at
>> com.acme.planning.interaction.rest.MobilogService.test(MobilogService.java:829)
>>     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:597)
>>     at
>> com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$ResponseOutInvoker._dispatch(EntityParamDispatchProvider.java:157)
>>     at
>> com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
>>     at
>> com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:154)
>>     at
>> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
>>     at
>> com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71)
>>     at
>> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
>>     at
>> com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:63)
>>     at
>> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:543)
>>     at
>> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:502)
>>     at
>> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:493)
>>     at
>> com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:308)
>>     at
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:314)
>>     at
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:239)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>     at
>> com.acme.common.filter.CacheControlFilter.doFilter(CacheControlFilter.java:72)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)
>>     at
>> org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
>>     at
>> org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.ui.basicauth.BasicProcessingFilter.doFilterHttp(BasicProcessingFilter.java:174)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
>>     at
>> org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
>>     at
>> org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
>>     at
>> org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
>>     at
>> org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
>>     at
>> org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>     at
>> org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
>>     at
>> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>     at
>> org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>     at
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>     at
>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
>>     at
>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>>     at
>> org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
>>     at
>> org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
>>     at
>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>>     at
>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>     at
>> org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
>>     at
>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>>     at
>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
>>     at
>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>>     at
>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>>     at
>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
>>     at java.lang.Thread.run(Thread.java:619)
>>
>>
>> tch wrote:
>>>
>>> Doesn't sound right, can you post the whole stack trace?
>>>
>>> ./tch
>>>
>>>
>>>
>>> On Fri, Mar 6, 2009 at 7:56 AM, jsw <marvin.438@xxxxxxxxx> wrote:
>>>>
>>>> OK, thank you, it seems I had misunderstood how to use the @Inheritance
>>>> annotation. However, in this case it does not seem to make a difference
>>>> since SINGLE_TABLE is the default inheritance type.
>>>>
>>>> Unfortunately, moving the @Inherintance annotation to the base class
>>>> did
>>>> not
>>>> solve my problem. EntityManager.find keeps trying to return an instance
>>>> of
>>>> the wrong entity.
>>>>
>>>> Maybe something more I've misunderstood?
>>>>
>>>>
>>>>
>>>> tch wrote:
>>>>>
>>>>> I've never used the @Inheritance annotation, but I believe it goes on
>>>>> the base class, not the extending entity.
>>>>>
>>>>> See:
>>>>> http://www.oracle.com/technology/products/ias/toplink/jpa/howto/use-inheritance.html
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Mar 6, 2009 at 3:00 AM, jsw <marvin.438@xxxxxxxxx> wrote:
>>>>>>
>>>>>> Environment: JBoss, Jersey, Spring, EclipseLink JPA, PostgreSQL
>>>>>>
>>>>>> @Entity
>>>>>> public abstract class Base {
>>>>>>    @Id
>>>>>>    @GeneratedValue(strategy = GenerationType.TABLE)
>>>>>>    private Long id;
>>>>>>
>>>>>>    @Version
>>>>>>    private long version;
>>>>>>
>>>>>>    ...
>>>>>> }
>>>>>>
>>>>>> @Entity
>>>>>> @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
>>>>>> public class Foo extends Base { ... }
>>>>>>
>>>>>> @Entity
>>>>>> @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
>>>>>> public class Bar extends Base { ... }
>>>>>>
>>>>>> Then when I do:
>>>>>>
>>>>>>    Long aId = 76576; // a valid id for an entity of type Bar
>>>>>>    Foo foo = em.find(Foo.class, aId); // em is EntityManager
>>>>>>
>>>>>> an exception is thrown (the root cause seems to be
>>>>>> ClassCastException)
>>>>>> because the EntityManager tries to return an object of type Bar.
>>>>>>
>>>>>> What am I doing wrong?
>>>>>> --
>>>>>> View this message in context:
>>>>>> http://www.nabble.com/EntityManager.find-returning-instance-of-wrong-type-tp22367490p22367490.html
>>>>>> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>>>>>>
>>>>>> _______________________________________________
>>>>>> eclipselink-users mailing list
>>>>>> eclipselink-users@xxxxxxxxxxx
>>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>>>
>>>>> _______________________________________________
>>>>> eclipselink-users mailing list
>>>>> eclipselink-users@xxxxxxxxxxx
>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>>
>>>>>
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/EntityManager.find-returning-instance-of-wrong-type-tp22367490p22371962.html
>>>> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>>>>
>>>> _______________________________________________
>>>> eclipselink-users mailing list
>>>> eclipselink-users@xxxxxxxxxxx
>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>
>>> _______________________________________________
>>> eclipselink-users mailing list
>>> eclipselink-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>>>
>>
>> --
>> View this message in context:
>> http://www.nabble.com/EntityManager.find-returning-instance-of-wrong-type-tp22367490p22372894.html
>> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> eclipselink-users mailing list
>> eclipselink-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> 
> 

-- 
View this message in context: http://www.nabble.com/EntityManager.find-returning-instance-of-wrong-type-tp22367490p22396645.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top