Problem with Multipletables in eclispelink.

View: New views
2 Messages — Rating Filter:   Alert me  

Problem with Multipletables in eclispelink.

by Balakrishna :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

 I am trying to migrate sample application from toplink to eclipselink..   I am able to migration most of them successfully.. But When view having references to multiple tables, iam facing problem with invalid identifier problem.. I am attaching the runtime xml and table creation scripts which will help to understand and recreate the problem..

Please help me to resolve this problem.  

Error in findTroubleTicket ...Order.TroubleTicketSearchResult failed with exception: Error invoking DAS.count() in das for class: abc.display.search.TroubleTicketSearchResultLocal Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.0 (Build 1.0 - 20080707)): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00904: "T1"."TRBL_TKT_OID": invalid identifier

Error Code: 904
Call: SELECT COUNT(*) FROM TRBL_TKT_PRIORITY_LEVEL_CD t3, TRBL_TKT_CATGRY_CD t2, ROOT t1, TRBL_TKT_VIEW t0 WHERE (((((((t0.TRBL_TKT_TRBL_TKT_ID LIKE ?) AND (t0.TRBL_TKT_STATUS_CD = ?)) AND (t0.TRBL_TKT_ROOT_OID = ?)) AND (t0.TRBL_TKT_CATGRY_CD = ?)) AND (t0.TRBL_TKT_PRIORITY_LEVEL_CD = ?)) AND (t0.ROOT_OWNING_ENTITY_ID IN (?, ?))) AND ((t3.TRBL_TKT_OID = t0.TRBL_TKT_OID) AND ((t2.TRBL_TKT_OID = t0.TRBL_TKT_OID) AND (t1.TRBL_TKT_OID = t0.TRBL_TKT_OID))))
    bind => [1000172%, 1, 1000644, 1000080, 1000020, OwningEntity1, InfinysEnterpriseOwningEntity]
Query: ReportQuery(abc.display.search.TroubleTicketSearchResult)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:322)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:646)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:500)
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:522)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:204)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:190)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:261)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:594)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2505)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2450)
    at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:821)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:666)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:844)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:456)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:906)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2588)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1178)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1162)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1108)
  **********************************************************
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
    at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475)
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59)
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
Caused by: java.sql.SQLException: ORA-00904: "T1"."TRBL_TKT_OID": invalid identifier

When i attached the eclipselink source to debug the problem, I did find that the following method is giving problem,  It is storing wrong references as join conditions which is givng problem at run time

  initializeMultipleTablePrimaryKeyFields(){
         // No additional fk info was specified so assume the pk field(s) are the named the same in the additional table.
                Map newKeyMapping = new HashMap(getPrimaryKeyFields().size() + 1);
                getAdditionalTablePrimaryKeyFields().put(table, newKeyMapping);

                // For each primary key field in the primary table, add a pk relationship from the primary table's pk field to the assumed identically named secondary pk field.
                List primaryKeyFields = getPrimaryKeyFields();
                for (int pkIndex = 0; pkIndex < primaryKeyFields.size(); pkIndex++) {
                    DatabaseField primaryKeyField = (DatabaseField)primaryKeyFields.get(pkIndex);
                    DatabaseField secondaryKeyField = (DatabaseField)primaryKeyField.clone();
                    secondaryKeyField.setTable(table);
                    newKeyMapping.put(primaryKeyField, secondaryKeyField);
                    // Must add this field to read, so translations work on database row.
                    getFields().addElement(secondaryKeyField);

                    if (!getQueryManager().hasCustomMultipleTableJoinExpression()) {
                        Expression keyJoinExpression = builder.getField(secondaryKeyField).equal(builder.getField(primaryKeyField));
                        joinExpression = keyJoinExpression.and(joinExpression);

                        getQueryManager().getTablesJoinExpressions().put(table, keyJoinExpression);
                        if(isChild) {
                            getInheritancePolicy().addChildTableJoinExpressionToAllParents(table, keyJoinExpression);
                        }
                    }
                }

 You can refer the attached files to recreate the problem...


   search.xmlTableCreation.txtDoc3.doc

Re: Problem with Multipletables in eclispelink.

by James Sutherland :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Your descriptor xml seems correct, it seems this is a bug in our multiple tables.  Please log the bug.

As a workaround you can use an amendment method to fix up the descriptor's multiple table foreign keys.


Balakrishna wrote:
 I am trying to migrate sample application from toplink to eclipselink..   I am able to migration most of them successfully.. But When view having references to multiple tables, iam facing problem with invalid identifier problem.. I am attaching the runtime xml and table creation scripts which will help to understand and recreate the problem..

Please help me to resolve this problem.  

Error in findTroubleTicket ...Order.TroubleTicketSearchResult failed with exception: Error invoking DAS.count() in das for class: abc.display.search.TroubleTicketSearchResultLocal Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.0 (Build 1.0 - 20080707)): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00904: "T1"."TRBL_TKT_OID": invalid identifier

Error Code: 904
Call: SELECT COUNT(*) FROM TRBL_TKT_PRIORITY_LEVEL_CD t3, TRBL_TKT_CATGRY_CD t2, ROOT t1, TRBL_TKT_VIEW t0 WHERE (((((((t0.TRBL_TKT_TRBL_TKT_ID LIKE ?) AND (t0.TRBL_TKT_STATUS_CD = ?)) AND (t0.TRBL_TKT_ROOT_OID = ?)) AND (t0.TRBL_TKT_CATGRY_CD = ?)) AND (t0.TRBL_TKT_PRIORITY_LEVEL_CD = ?)) AND (t0.ROOT_OWNING_ENTITY_ID IN (?, ?))) AND ((t3.TRBL_TKT_OID = t0.TRBL_TKT_OID) AND ((t2.TRBL_TKT_OID = t0.TRBL_TKT_OID) AND (t1.TRBL_TKT_OID = t0.TRBL_TKT_OID))))
    bind => [1000172%, 1, 1000644, 1000080, 1000020, OwningEntity1, InfinysEnterpriseOwningEntity]
Query: ReportQuery(abc.display.search.TroubleTicketSearchResult)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:322)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:646)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:500)
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:522)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:204)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:190)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:261)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:594)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2505)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2450)
    at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:821)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:666)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:844)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:456)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:906)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2588)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1178)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1162)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1108)
  **********************************************************
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
    at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475)
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59)
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
Caused by: java.sql.SQLException: ORA-00904: "T1"."TRBL_TKT_OID": invalid identifier

When i attached the eclipselink source to debug the problem, I did find that the following method is giving problem,  It is storing wrong references as join conditions which is givng problem at run time

  initializeMultipleTablePrimaryKeyFields(){
         // No additional fk info was specified so assume the pk field(s) are the named the same in the additional table.
                Map newKeyMapping = new HashMap(getPrimaryKeyFields().size() + 1);
                getAdditionalTablePrimaryKeyFields().put(table, newKeyMapping);

                // For each primary key field in the primary table, add a pk relationship from the primary table's pk field to the assumed identically named secondary pk field.
                List primaryKeyFields = getPrimaryKeyFields();
                for (int pkIndex = 0; pkIndex < primaryKeyFields.size(); pkIndex++) {
                    DatabaseField primaryKeyField = (DatabaseField)primaryKeyFields.get(pkIndex);
                    DatabaseField secondaryKeyField = (DatabaseField)primaryKeyField.clone();
                    secondaryKeyField.setTable(table);
                    newKeyMapping.put(primaryKeyField, secondaryKeyField);
                    // Must add this field to read, so translations work on database row.
                    getFields().addElement(secondaryKeyField);

                    if (!getQueryManager().hasCustomMultipleTableJoinExpression()) {
                        Expression keyJoinExpression = builder.getField(secondaryKeyField).equal(builder.getField(primaryKeyField));
                        joinExpression = keyJoinExpression.and(joinExpression);

                        getQueryManager().getTablesJoinExpressions().put(table, keyJoinExpression);
                        if(isChild) {
                            getInheritancePolicy().addChildTableJoinExpressionToAllParents(table, keyJoinExpression);
                        }
                    }
                }

 You can refer the attached files to recreate the problem...


   search.xmlTableCreation.txtDoc3.doc