Hi, I am having an issue with openjpa-2.2.3. I have set the property: openjpa.jdbc.DBDictionary=mysql This seems to be recognized as I see SQL queries going to the database using the backtick quoting that the MySQLDictionary employs.
However, I eventually run into issues where a field like T1.`KEY_ID` is not located: Caused by: java.sql.SQLException: t1."KEY_ID" at org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.findObject(SelectImpl.java:2510) at org.apache.openjpa.jdbc.sql.ResultSetResult.translate(ResultSetResult.java:497) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1059) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:411) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:306) Note that the key in the exception message uses double quotes -- this is why the one with backticks is not found. I was able to find where these double-quoted column names came from (please excuse any weirdness in the names below, I had to use OCR from a screenshot to get this stack due to Eclipse bug): DefaultIdentifierConfiguration.getLeadingDelimiter() line: 55 DBIdentifierUtilImpl(IdentifierUtilImpl).isDelimited(IdentifierConfiguration, IdentifierRuIe, String) line: 329 DBIdentifierUtilImpl(IdentifierUtilImpl).delimit(IdentifierConfiguration, IdentifierRuIe, String, boolean) line: 315 DBIdentifierUtilImpl(IdentifierUtilImpl).delimit(1dentifierRuIe, String, boolean) line: 307 Normalizer.delimit(String, boolean) line: 288 DBIdentifier.setName(String, boolean) line: 140 DBIdentifier.<init> (String, DBIdentifierSDBIdentifierType, boolean) line: 102 DBIdentifier.toArray(String[], DBIdentifierSDBIdentifierType, boolean) line: 432 AnnotationPersistenceMappingParser.createUniqueConstraint(MetaDataContext, UniqueConstraint) line: 543 AnnotationPersistenceMappingParser.addUniqueConstraints(String, MetaDataContext, MappingInfo, UniqueConstraint...) line: 562 AnnotationPersistenceMappingParser.parseTabIe(ClassMapping, Table) line: 535 AnnotationPersistenceMappingParser.parseClassMappingAnnotations(ClassMetaData) line: 350 AnnotationPersistenceMappingParser(AnnotationPersistenceMetaDataParser).parseClassAnnotationsO line: 697 AnnotationPersistenceMappingParser(AnnotationPersistenceMetaDataParser).parse(Class<?>) line: 415 PersistenceMappingFactory(PersistenceMetaDataFactory).Ioad(Class<?>, int, ClassLoader) line: 260 MappingRepository(MetaDataRepository).getMetaDataInternal(Class<?>, ClassLoader) line: 586 MappingRepository(MetaDataRepository).getMetaDataInternal(Class ?>, ClassLoader, boolean) line: 396 MappingRepository(MetaDataRepository).getMetaData(Class< ?>, ClassLoader, boolean) line: 388 VaIueMappingImpIWalueMetaDataImpl).resolveDecIaredType(Class) line: 491 VaIueMappingImpIWalueMetaDataImpl).resolve(int) line: 470 VaIueMappingIran.resoIve(int) line: 508 FieldMapping(FieldMetaData).resolve(int) line: 1883 FieldMapping.resolve(int) line: 460 ClassMapping(ClassMetaData).resolveMeta(booIean) line: 1874 ClassMapping(ClassMetaData).resolve(int) line: 1808 MappingRepository(MetaDataRepository).processBuffer(ClassMetaData, List<ClassMetaData>, int) line: 828 MappingRepository(MetaDataRepository).resolveMeta(ClassMetaData) line: 725 MappingRepository(MetaDataRepository).resolve(ClassMetaData) line: 649 MappingRepository(MetaDataRepository).getMetaDataInternaI(Class< ?>, ClassLoader, boolean) line: 417 MappingRepository(MetaDataRepository).getMetaData(Class< ?>, ClassLoader, boolean) line: 388 PCEnhancer.<init>(OpenJPAConfiguration, BCClass, MetaDataRepository, ClassLoader) line: 286 PCEnhancer.<init>(OpenJPAConfiguration, BCClass, MetaDataRepository) line: 257 PCClassFiIeTransformer.transformo(String, Class, bytell) line: 146 PCClassFiIeTransformer.transform(ClassLoader, String, Class, ProtectionDornain, bytell) line: 126 PersistenceProviderImplSClassTransformerIran.transform(ClassLoader, String, Class< ?>, ProtectionDomain, bytell) line: 292 OSGiJPAPUnitInfo(JPAPUnitInfo).transformClass(String, bytel], CodeSource, ClassLoader) line: 1426 ClassLoadingServiceIranSClassFiIeTransformerAdapter.transform(ClassLoader, String, Class< ?>, ProtectionDomain, bytell) line: 278 AppClassLoader.findClass(String) line: 289 In the DBIdentifier.java class it uses the static Normalizer to delimit names: /** * Set the name of the identifier and optionally force delimiting of the identifier. */ public void setName(String name, boolean delimit) { assertNotNull(); // Normalize the name, if necessary. Do not normalize constants or column definitions. if (DBIdentifierType.CONSTANT != getType() && DBIdentifierType. COLUMN_DEFINITION != getType()) { if (delimit) { name = Normalizer.delimit(name, true); } else { name = Normalizer.normalizeString(name); } } super.setName(name); } And that Normalizer uses a DefaultIdentifierConfiguration instance which has double-quote for leading and trailing identifier. Is this a bug? Is there some configuration I am missing? Any guidance is appreciated.