-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Best way to change a persistent object to a subclass
PostPosted: Wed Aug 09, 2006 8:07 pm 
Beginner
Beginner

Joined: Mon Apr 24, 2006 9:47 pm
Posts: 33
Location: Kansas City, MO
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Question: What is the best way to convert a persistent object with many associations into a subclass with a table per concrete class implementation?

Hibernate version: 3.1.2

Mapping documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nkics.socialworkprn.swan.domain.Lead" table="LEAD">
        <id name="id" type="int">
            <column name="LEAD_ID" />
            <generator class="native" />
        </id>
        <many-to-one name="primaryLeadLocation" class="com.nkics.socialworkprn.swan.domain.LeadLocation" fetch="select" lazy="false" cascade="persist,merge,save-update">
            <column name="PRIMARY_LEAD_LOCATION_ID" />
        </many-to-one>
        <many-to-one name="leadType" class="com.nkics.socialworkprn.swan.domain.LeadType" fetch="select" lazy="false">
            <column name="LEAD_TYPE_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="office" class="com.nkics.socialworkprn.swan.domain.Office" fetch="select">
            <column name="OFFICE_ID" not-null="true" />
        </many-to-one>
        <property name="active" type="boolean">
            <column name="LEAD_ACTIVE" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="LEAD_NAME" length="40" not-null="true" />
        </property>
        <property name="gsaSigned" type="timestamp">
            <column name="LEAD_GSA_SIGNED" length="23" />
        </property>
        <property name="vendorAgreement" type="boolean">
            <column name="LEAD_VENDOR_AGREEMENT" not-null="true" />
        </property>
        <property name="requirementsNote" type="string">
            <column name="LEAD_REQUIREMENTS_NOTE" length="2000" />
        </property>
        <property name="generalNote" type="string">
            <column name="LEAD_GENERAL_NOTE" length="2000" />
        </property>
        <property name="leadCreated" type="timestamp">
            <column name="LEAD_CREATED" length="23" not-null="true" />
        </property>
        <property name="leadUpdated" type="timestamp">
            <column name="LEAD_UPDATED" length="23" />
        </property>
        <set name="leadLocations" inverse="true" cascade="all,delete-orphan">
            <key>
                <column name="LEAD_ID" not-null="true" />
            </key>
            <one-to-many class="com.nkics.socialworkprn.swan.domain.LeadLocation" />
        </set>
       <joined-subclass name="com.nkics.socialworkprn.swan.domain.Client" table="CLIENT">
         <key column="LEAD_ID" />
           <property name="clientCreated" type="timestamp">
               <column name="CLIENT_CREATED" length="23" not-null="true" />
           </property>
       </joined-subclass>
    </class>
</hibernate-mapping>


Database Table Exerpt:
Code:
CREATE TABLE LEAD(
    LEAD_ID                     int              IDENTITY(1,1),
    LEAD_ACTIVE                 bit              NOT NULL,
    LEAD_NAME                   varchar(128)     NOT NULL,
    LEAD_GSA_SIGNED             datetime         NULL,
    LEAD_VENDOR_AGREEMENT       bit              NOT NULL,
    LEAD_REQUIREMENTS_NOTE      varchar(2000)    NULL,
    LEAD_GENERAL_NOTE           varchar(2000)    NULL,
    LEAD_CREATED                datetime         NOT NULL,
    LEAD_UPDATED                datetime         NULL,
    LEAD_TYPE_ID                int              NOT NULL,
    OFFICE_ID                   int              NOT NULL,
    PRIMARY_LEAD_LOCATION_ID    int              NULL,
    CONSTRAINT PK39 PRIMARY KEY NONCLUSTERED (LEAD_ID)
)
go

CREATE TABLE CLIENT(
    LEAD_ID           int         NOT NULL,
    CLIENT_CREATED    datetime    NOT NULL,
    CONSTRAINT PK46 PRIMARY KEY NONCLUSTERED (LEAD_ID)
)
go

ALTER TABLE CLIENT ADD
    FOREIGN KEY (LEAD_ID)
    REFERENCES LEAD(LEAD_ID)
go


Code between sessionFactory.openSession() and session.close():
I have tried several things, none of which works.
Code:
public Client convertLeadToClientById(int id)
{
   logger.debug("converting lead#"+id+" to client");
   try
   {
      SQLQuery sqlQuery = getSession().createSQLQuery("INSERT INTO CLIENT (LEAD_ID, CLIENT_CREATED) VALUES (?,?)");
      sqlQuery.setInteger(0, id);
      sqlQuery.setDate(1, new Date());
      sqlQuery.executeUpdate();
      Client client = (Client)getSession().get(Client.class, id);
      logger.debug("converted lead#"+id+" to client successfully");
      return client;
   }
   catch (RuntimeException e)
   {
      logger.error("failed to convert lead#"+id+" to client");
      throw e;
   }
}


Full stack trace of any exception that occurs:
Code:
java.lang.UnsupportedOperationException: Update queries only supported through HQL
   org.hibernate.impl.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:753)
   com.nkics.socialworkprn.swan.persistence.hibernate.HibernateClientDao.convertLeadToClientById(HibernateClientDao.java:73)
   com.nkics.socialworkprn.swan.service.defaults.DefaultLeadService.convertLeadToClientById(DefaultLeadService.java:486)
   com.nkics.socialworkprn.swan.service.defaults.DefaultLeadService.updateLead(DefaultLeadService.java:473)
   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   java.lang.reflect.Method.invoke(Method.java:585)
   org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
   org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
   org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
   $Proxy6.updateLead(Unknown Source)
   com.nkics.socialworkprn.swan.mvc.client.UpdateLeadController.doSubmitAction(UpdateLeadController.java:314)
   org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:415)
   org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:382)
   org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:356)
   org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:258)
   org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:249)
   org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
   org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:723)
   org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663)
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394)
   org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:358)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:292)
   org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
   org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:79)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter.doFilter(SwitchUserProcessingFilter.java:382)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:143)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:138)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:174)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:207)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:246)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:220)
   org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:173)
   org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:120)


Code between sessionFactory.openSession() and session.close():
This doesn't work either...
Code:
public Client convertLeadToClientById(int id)
{
   logger.debug("converting lead#"+id+" to client");
   try
   {
      Client client = new Client();
      client.setId(id);
      getSession().saveOrUpdate(client);
      logger.debug("converted lead#"+id+" to client successfully");
      return client;
   }
   catch (RuntimeException e)
   {
      logger.error("failed to convert lead#"+id+" to client");
      throw e;
   }
}


Full stack trace of any exception that occurs:
Code:
2006-08-09 18:39:47,001 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/swan].[swan]] - Servlet.service() for servlet swan threw exception
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.nkics.socialworkprn.swan.domain.Client#5]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.nkics.socialworkprn.swan.domain.Client#5]
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.nkics.socialworkprn.swan.domain.Client#5]
   at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:629)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:258)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:216)
   at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
   at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:588)
   at org.hibernate.impl.SessionImpl.update(SessionImpl.java:576)
   at org.hibernate.impl.SessionImpl.update(SessionImpl.java:568)
   at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:661)
   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
   at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:658)
   at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:654)
   at com.nkics.socialworkprn.swan.persistence.hibernate.HibernateClientDao.convertLeadToClientById(HibernateClientDao.java:75)
   at com.nkics.socialworkprn.swan.service.defaults.DefaultLeadService.convertLeadToClientById(DefaultLeadService.java:486)
   at com.nkics.socialworkprn.swan.service.defaults.DefaultLeadService.updateLead(DefaultLeadService.java:473)
   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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
   at $Proxy6.updateLead(Unknown Source)
   at com.nkics.socialworkprn.swan.mvc.client.UpdateLeadController.doSubmitAction(UpdateLeadController.java:314)
   at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:415)
   at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:382)
   at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:356)
   at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:258)
   at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:249)
   at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
   at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:723)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394)
   at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:358)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:292)
   at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
   at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:79)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter.doFilter(SwitchUserProcessingFilter.java:382)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:143)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:138)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:174)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:207)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:246)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:220)
   at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
   at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:173)
   at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:120)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
   at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
   at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
   at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
   at java.lang.Thread.run(Thread.java:595)


Please help. This is holding up my project. Thanks in advance.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.