persistence@glassfish.java.net

RE: Problem with _at_AssociationOverride on Embedded ManyToOne Relation

From: Gordon Yorke <gordon.yorke_at_oracle.com>
Date: Wed, 6 Feb 2008 09:28:22 -0500

First this is a bug so please file a issue in the bug tracker.
Second, you will need to remove the @AssociationOverride from your code and use a session customer to update the join columns in native TopLink.

Persistence.xml entry:
<property name="toplink.session.customizer" value="mypackage.EmbeddableCustomizer"/>

Customizer Class :
package mypackage;

import oracle.toplink.essentials.descriptors.ClassDescriptor;
import oracle.toplink.essentials.mappings.AggregateObjectMapping;
import oracle.toplink.essentials.sessions.Session;
import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;

import ....ProcessActivityResult.class

public class EmbeddableCustomizer implements SessionCustomizer {

 public void customize(Session session) throws Exception {
  //get internal representation of Class to Database mappings
  ClassDescriptor descriptor = (ClassDescriptor)session.getDescriptor(ProcessActivityResult.class);
          
  ((AggregateObjectMapping)descriptor.getMappingForAttributeName("valueActual")).addFieldNameTranslation("ACTUAL_SELECTIONLISTITEMID","SELECTIONLISTITEMID");
 }
}
 
--Gordon

 -----Original Message-----
From: Christian Kerwer [mailto:Christian.Kerwer_at_t-online.de]
Sent: Wednesday, February 06, 2008 9:01 AM
To: persistence_at_glassfish.dev.java.net
Subject: Problem with @AssociationOverride on Embedded ManyToOne Relation


  Hi everyone,

   

  I'm trying to use an @AssociationOverride on a manyToOne relation of an Emedded Type to rename the Column in the actual Entity:

   

  @Entity

  Public class ProcessActivityResult

  {

     .

     @Embedded

     @AssociationOverride(name="selectionListItem", joinColumns=_at_JoinColumn(name="ACTUAL_SELECTIONLISTITEMID"))

     private DynamicAttributeVal valueActual;

  }

   

  @Embeddable

  public class DynamicAttributeVal

  {

     .

     @ManyToOne

     @JoinColumn( name="SELECTIONLISTITEMID" )

     private SelectionListItem selectionListItem;

  }

   

  This leads to the following exception:

  javax.persistence.PersistenceException: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.0.1 (Build b03-fcs (10/03/2007))): oracle.toplink.essentials.exceptions.EntityManagerSetupException

  Exception Description: predeploy for PersistenceUnit [toplink] failed.

  Internal Exception: java.lang.NullPointerException

         at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:643)

         at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createContainerEntityManagerFactory(EntityManagerFactoryProvider.java:244)

         at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:149)

         at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:84)

         at com.sun.enterprise.server.AbstractLoader.loadPersistenceUnits(AbstractLoader.java:898)

         at com.sun.enterprise.server.ApplicationLoader.doLoad(ApplicationLoader.java:184)

         at com.sun.enterprise.server.TomcatApplicationLoader.doLoad(TomcatApplicationLoader.java:126)

         at com.sun.enterprise.server.AbstractLoader.load(AbstractLoader.java:244)

         at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:336)

         at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:230)

         at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:203)

         at com.sun.enterprise.server.ApplicationManager.applicationEnabled(ApplicationManager.java:763)

         at com.sun.enterprise.admin.event.AdminEventMulticaster.invokeApplicationDeployEventListener(AdminEventMulticaster.java:934)

         at com.sun.enterprise.admin.event.AdminEventMulticaster.handleApplicationDeployEvent(AdminEventMulticaster.java:912)

         at com.sun.enterprise.admin.event.AdminEventMulticaster.processEvent(AdminEventMulticaster.java:461)

         at com.sun.enterprise.admin.event.AdminEventMulticaster.multicastEvent(AdminEventMulticaster.java:176)

         at com.sun.enterprise.admin.mbeans.ApplicationsConfigMBean.sendEnableConfigChangeEventExplicitly(ApplicationsConfigMBean.java:1834)

         at com.sun.enterprise.admin.mbeans.ApplicationsConfigMBean.enable(ApplicationsConfigMBean.java:1902)

   

   

  The second try using the AssociationOverride on the Entity like this:

   

  @Entity

  @AssociationOverride(name=" valueActual.selectionListItem", joinColumns=_at_JoinColumn(name="ACTUAL_SELECTIONLISTITEMID"))

  Public class ProcessActivityResult

  {

     .

     @Embedded

     private DynamicAttributeVal valueActual;

  }

   

  Doesn't effect the renaming. In this case toplink looks up for a column named ,SELECTIONLISTITEMID' instead of ,ACTUAL_SELECTIONLISTITEMID'.

   

  Can anybody help, this is very urgent!

   

   

  Christian Kerwer