You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Alexey Romanov <al...@gmail.com> on 2012/06/09 09:11:13 UTC

Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

I've tried to change mapping defaults to use lowercase underscore column names:

package ru.focusmedia.odp.server.datastore.jpa.impl;

import org.apache.openjpa.jdbc.identifier.DBIdentifier;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Table;
import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;

public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
    @Override
    protected void correctName(Table table, Column col) {
        DBIdentifier name =
DBIdentifier.newColumn(col.getIdentifier().getName(), true);
        DBIdentifier validName = dict.getValidColumnName(name, table);
        DBIdentifier correctedName = DBIdentifier
                .newColumn(addUnderscores(validName.getName()));
        col.setIdentifier(correctedName);
        table.addCorrectedColumnName(correctedName, true);
    }

    // taken from Hibernate's ImprovedNamingStrategy
    private static String addUnderscores(String name) {
        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1))
                    && Character.isUpperCase(buf.charAt(i))
                    && Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase();
    }
}

and added

<property name="openjpa.jdbc.MappingDefaults"
    value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>

to persistence.xml. However, this produces the following error:

org.apache.openjpa.persistence.PersistenceException: Table/View
'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
state=42X05]
    at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
~[openjpa-2.2.0.jar:2.2.0]
    at com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
~[querydsl-jpa-2.6.0.jar:na]
    at com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
~[querydsl-jpa-2.6.0.jar:na]
    at com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
~[querydsl-jpa-2.6.0.jar:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
[classes/:na]
    at ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
[test-classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.6.0_31]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_31]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_31]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
[junit-4.10.jar:na]
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
[junit-4.10.jar:na]
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
[junit-4.10.jar:na]
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
[junit-4.10.jar:na]
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
[junit-4.10.jar:na]
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
[junit-4.10.jar:na]
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
[junit-4.10.jar:na]
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
[junit-4.10.jar:na]
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
[junit-4.10.jar:na]
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
[junit-4.10.jar:na]
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
[junit-4.10.jar:na]
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
[.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
[.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
[.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
[.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
[.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[.cp/:na]
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
WITH RR} [code=20000, state=42X05]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
~[openjpa-2.2.0.jar:2.2.0]
    at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
~[openjpa-2.2.0.jar:2.2.0]
    ... 58 common frames omitted

before any tables are created. Googling says this may happen because
SynchronizeMappings isn't set, but it is in my case:

<property name="openjpa.jdbc.SynchronizeMappings"
    value="buildSchema(ForeignKeys=true)" />
<property name="openjpa.jdbc.DBDictionary"
    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />

How can I get this to work?

Yours, Alexey Romanov

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
Option 1 is probably the more suitable one. My current solution
preserves the case, but I don't actually need that; lowercase
everywhere is good enough. Thanks!

Yours, Alexey Romanov


On Thu, Jun 21, 2012 at 7:06 PM, Dianne Richards [via OpenJPA]
<ml...@n2.nabble.com> wrote:
> ok - I didn't catch it earlier that you wanted lowercase. You actually have
> 2 options:
>
> 1 - You can call toLower() on your validName. Here's the revised method.
>
> protected void correctName(Table table, Column col) {
>         DBIdentifier name =
>             DBIdentifier.newColumn(col.getIdentifier().getName(), false);
>         DBIdentifier correctedName =
>             DBIdentifier.newColumn(addUnderscores(name.getName()));
>         DBIdentifier validName = dict.getValidColumnName(correctedName,
> table);
>         DBIdentifier validNameLower = validName.toLower(validName);
>         col.setIdentifier(validNameLower);
>         table.addCorrectedColumnName(validNameLower, true);
>     }
>
> 2 - You can actually override DBIdentifierUtilImpl and specify the new
> class with the jdbc.IdentifierUtil property. You can then have
> makeIdentifierValid() do what you want.
>
> Note: Even though your SQL has lower case names, in many DBs the name will
> be set to uppercase. The only way to preserve case is to delimit the names.
>
> Dianne
>
> On Wed, Jun 20, 2012 at 2:39 PM, Alexey Romanov
> <[hidden email]>wrote:
>
>> Yes, that was one of things I've tried, but I much prefer lowercase
>> for identifiers in SQL to make it more readable :) And I've decided
>> that complicating my MappingDefaults for it slightly is a good
>> tradeoff.
>>
>> One more complication was that in the OSGi setting I had to add a
>> fragment to the OpenJPA bundle to let it load my MappingDefaults class
>> and presumably the same would apply to other classes specified by
>> plugin strings. Perhaps OpenJPA bundle headers should include
>> `DynamicImport-Package: *`?
>>
>> Yours, Alexey Romanov
>>
>>
>> On Wed, Jun 20, 2012 at 9:37 PM, Dianne Richards [via OpenJPA]
>> <[hidden email]> wrote:
>> > ok - Here's what I think you should do. First, set the delimit value to
>> > "false" in the newColumn() call, as I indicated in a previous post.
>> > Then,
>> > switch the statements for assigning validName and correctedName. Here's
>> an
>> > example:
>> >
>> > public class ImprovedMappingDefaults extends PersistenceMappingDefaults
>> > {
>> >     @Override
>> >     protected void correctName(Table table, Column col) {
>> >       DBIdentifier name =
>> >           DBIdentifier.newColumn(col.getIdentifier().getName(), false);
>> >       DBIdentifier correctedName =
>> >               DBIdentifier.newColumn(addUnderscores(name.getName()));
>> >       DBIdentifier validName = dict.getValidColumnName(correctedName,
>> > table);
>> >       col.setIdentifier(validName);
>> >       table.addCorrectedColumnName(validName, true);
>> >   }
>> >
>> > I think this change will at least allow the table to be created as you
>> > desire.
>> >
>> > Here's the SQL for my test:
>> > CREATE TABLE object_classes -- EntityWithUnderscore
>> >     (ID_COL INTEGER NOT NULL, NAME VARCHAR(255) NOT NULL, NAME_COL
>> > VARCHAR(255), PRIMARY KEY (ID_COL), CONSTRAINT U_BJCTSSS_NAME UNIQUE
>> (NAME))
>> >
>> > I haven't tried any queries. I will if you run into later problems.
>> >
>> > Dianne
>> >
>> > On Wed, Jun 20, 2012 at 12:04 PM, Dianne Richards <[hidden email]>wrote:
>> >
>> >> Oops - I just looked more closely at the output, and it's not what you
>> >> want. I'll keep going.
>> >>
>> >> Dianne
>> >>
>> >>
>> >> On Wed, Jun 20, 2012 at 11:53 AM, Dianne Richards <[hidden
>> >> email]>wrote:
>> >>
>> >>> Hi Alexey - I was able to reproduce this problem with a simple test
>> case
>> >>> and debug it. I think you can get what you want by changing the
>> following
>> >>> line in your ImprovedMappingDefaults:
>> >>>
>> >>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>> >>>
>> >>> Change the "true" to "false". What's happening is the true says to
>> >>> delimit the name, which has a rippling effect. I don't think you want
>> >>> this.
>> >>>
>> >>> It works on my simple test, so hopefully it will work for you.
>> >>>
>> >>> Dianne
>> >>>
>> >>>
>> >>> On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov <
>> >>> [hidden email]> wrote:
>> >>>
>> >>>> I've tried to change mapping defaults to use lowercase underscore
>> column
>> >>>> names:
>> >>>>
>> >>>> package ru.focusmedia.odp.server.datastore.jpa.impl;
>> >>>>
>> >>>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
>> >>>> import org.apache.openjpa.jdbc.schema.Column;
>> >>>> import org.apache.openjpa.jdbc.schema.Table;
>> >>>> import
>> >>>> org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>> >>>>
>> >>>> public class ImprovedMappingDefaults extends
>> PersistenceMappingDefaults
>> >>>> {
>> >>>>    @Override
>> >>>>    protected void correctName(Table table, Column col) {
>> >>>>        DBIdentifier name =
>> >>>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>> >>>>        DBIdentifier validName = dict.getValidColumnName(name, table);
>> >>>>        DBIdentifier correctedName = DBIdentifier
>> >>>>                .newColumn(addUnderscores(validName.getName()));
>> >>>>        col.setIdentifier(correctedName);
>> >>>>        table.addCorrectedColumnName(correctedName, true);
>> >>>>    }
>> >>>>
>> >>>>    // taken from Hibernate's ImprovedNamingStrategy
>> >>>>    private static String addUnderscores(String name) {
>> >>>>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>> >>>>        for (int i = 1; i < buf.length() - 1; i++) {
>> >>>>            if (Character.isLowerCase(buf.charAt(i - 1))
>> >>>>                    && Character.isUpperCase(buf.charAt(i))
>> >>>>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>> >>>>                buf.insert(i++, '_');
>> >>>>            }
>> >>>>        }
>> >>>>        return buf.toString().toLowerCase();
>> >>>>    }
>> >>>> }
>> >>>>
>> >>>> and added
>> >>>>
>> >>>> <property name="openjpa.jdbc.MappingDefaults"
>> >>>>
>> >>>>
>> >>>>
>>
>>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>> >>>>
>> >>>> to persistence.xml. However, this produces the following error:
>> >>>>
>> >>>> org.apache.openjpa.persistence.PersistenceException: Table/View
>> >>>> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
>> >>>> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
>> >>>> state=42X05]
>> >>>>    at
>> >>>>
>> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>> org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>> org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
>> >>>> ~[querydsl-jpa-2.6.0.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
>> >>>> ~[querydsl-jpa-2.6.0.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
>> >>>> ~[querydsl-jpa-2.6.0.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
>> >>>> [classes/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
>> >>>> [test-classes/:na]
>> >>>>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >>>> ~[na:1.6.0_31]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >>>> ~[na:1.6.0_31]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >>>> ~[na:1.6.0_31]
>> >>>>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>> >>>> [junit-4.10.jar:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>> >>>> [.cp/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> >>>> [.cp/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>> >>>> [.cp/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>> >>>> [.cp/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>> >>>> [.cp/:na]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>> >>>> [.cp/:na]
>> >>>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
>> >>>> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
>> >>>> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
>> >>>> WITH RR} [code=20000, state=42X05]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    at
>> >>>>
>> >>>>
>>
>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
>> >>>> ~[openjpa-2.2.0.jar:2.2.0]
>> >>>>    ... 58 common frames omitted
>> >>>>
>> >>>> before any tables are created. Googling says this may happen because
>> >>>> SynchronizeMappings isn't set, but it is in my case:
>> >>>>
>> >>>> <property name="openjpa.jdbc.SynchronizeMappings"
>> >>>>    value="buildSchema(ForeignKeys=true)" />
>> >>>> <property name="openjpa.jdbc.DBDictionary"
>> >>>>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>> >>>>
>> >>>> How can I get this to work?
>> >>>>
>> >>>> Yours, Alexey Romanov
>> >>>>
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Thanks - Dianne
>> >>>
>> >>
>> >>
>> >>
>> >> --
>> >> Thanks - Dianne
>> >>
>> >
>> >
>> >
>> > --
>> > Thanks - Dianne
>> >
>> >
>> > ________________________________
>> > If you reply to this email, your message will be added to the discussion
>> > below:
>> >
>>
>> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580349.html
>> > To unsubscribe from Change of MappingDefaults breaks
>> OPENJPA_SEQUENCE_TABLE,
>> > click here.
>> > NAML
>>
>>
>> --
>> View this message in context:
>>
>> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580352.html
>
>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>
>
>
>
> --
> Thanks - Dianne
>
>
> ________________________________
> If you reply to this email, your message will be added to the discussion
> below:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580363.html
> To unsubscribe from Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE,
> click here.
> NAML


--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580367.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Dianne Richards <di...@gmail.com>.
ok - I didn't catch it earlier that you wanted lowercase. You actually have
2 options:

1 - You can call toLower() on your validName. Here's the revised method.

protected void correctName(Table table, Column col) {
        DBIdentifier name =
            DBIdentifier.newColumn(col.getIdentifier().getName(), false);
        DBIdentifier correctedName =
            DBIdentifier.newColumn(addUnderscores(name.getName()));
        DBIdentifier validName = dict.getValidColumnName(correctedName,
table);
        DBIdentifier validNameLower = validName.toLower(validName);
        col.setIdentifier(validNameLower);
        table.addCorrectedColumnName(validNameLower, true);
    }

2 - You can actually override DBIdentifierUtilImpl and specify the new
class with the jdbc.IdentifierUtil property. You can then have
makeIdentifierValid() do what you want.

Note: Even though your SQL has lower case names, in many DBs the name will
be set to uppercase. The only way to preserve case is to delimit the names.

Dianne

On Wed, Jun 20, 2012 at 2:39 PM, Alexey Romanov
<al...@gmail.com>wrote:

> Yes, that was one of things I've tried, but I much prefer lowercase
> for identifiers in SQL to make it more readable :) And I've decided
> that complicating my MappingDefaults for it slightly is a good
> tradeoff.
>
> One more complication was that in the OSGi setting I had to add a
> fragment to the OpenJPA bundle to let it load my MappingDefaults class
> and presumably the same would apply to other classes specified by
> plugin strings. Perhaps OpenJPA bundle headers should include
> `DynamicImport-Package: *`?
>
> Yours, Alexey Romanov
>
>
> On Wed, Jun 20, 2012 at 9:37 PM, Dianne Richards [via OpenJPA]
> <ml...@n2.nabble.com> wrote:
> > ok - Here's what I think you should do. First, set the delimit value to
> > "false" in the newColumn() call, as I indicated in a previous post. Then,
> > switch the statements for assigning validName and correctedName. Here's
> an
> > example:
> >
> > public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
> >     @Override
> >     protected void correctName(Table table, Column col) {
> >       DBIdentifier name =
> >           DBIdentifier.newColumn(col.getIdentifier().getName(), false);
> >       DBIdentifier correctedName =
> >               DBIdentifier.newColumn(addUnderscores(name.getName()));
> >       DBIdentifier validName = dict.getValidColumnName(correctedName,
> > table);
> >       col.setIdentifier(validName);
> >       table.addCorrectedColumnName(validName, true);
> >   }
> >
> > I think this change will at least allow the table to be created as you
> > desire.
> >
> > Here's the SQL for my test:
> > CREATE TABLE object_classes -- EntityWithUnderscore
> >     (ID_COL INTEGER NOT NULL, NAME VARCHAR(255) NOT NULL, NAME_COL
> > VARCHAR(255), PRIMARY KEY (ID_COL), CONSTRAINT U_BJCTSSS_NAME UNIQUE
> (NAME))
> >
> > I haven't tried any queries. I will if you run into later problems.
> >
> > Dianne
> >
> > On Wed, Jun 20, 2012 at 12:04 PM, Dianne Richards <[hidden email]>wrote:
> >
> >> Oops - I just looked more closely at the output, and it's not what you
> >> want. I'll keep going.
> >>
> >> Dianne
> >>
> >>
> >> On Wed, Jun 20, 2012 at 11:53 AM, Dianne Richards <[hidden email]>wrote:
> >>
> >>> Hi Alexey - I was able to reproduce this problem with a simple test
> case
> >>> and debug it. I think you can get what you want by changing the
> following
> >>> line in your ImprovedMappingDefaults:
> >>>
> >>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
> >>>
> >>> Change the "true" to "false". What's happening is the true says to
> >>> delimit the name, which has a rippling effect. I don't think you want
> >>> this.
> >>>
> >>> It works on my simple test, so hopefully it will work for you.
> >>>
> >>> Dianne
> >>>
> >>>
> >>> On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov <
> >>> [hidden email]> wrote:
> >>>
> >>>> I've tried to change mapping defaults to use lowercase underscore
> column
> >>>> names:
> >>>>
> >>>> package ru.focusmedia.odp.server.datastore.jpa.impl;
> >>>>
> >>>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
> >>>> import org.apache.openjpa.jdbc.schema.Column;
> >>>> import org.apache.openjpa.jdbc.schema.Table;
> >>>> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
> >>>>
> >>>> public class ImprovedMappingDefaults extends
> PersistenceMappingDefaults
> >>>> {
> >>>>    @Override
> >>>>    protected void correctName(Table table, Column col) {
> >>>>        DBIdentifier name =
> >>>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
> >>>>        DBIdentifier validName = dict.getValidColumnName(name, table);
> >>>>        DBIdentifier correctedName = DBIdentifier
> >>>>                .newColumn(addUnderscores(validName.getName()));
> >>>>        col.setIdentifier(correctedName);
> >>>>        table.addCorrectedColumnName(correctedName, true);
> >>>>    }
> >>>>
> >>>>    // taken from Hibernate's ImprovedNamingStrategy
> >>>>    private static String addUnderscores(String name) {
> >>>>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
> >>>>        for (int i = 1; i < buf.length() - 1; i++) {
> >>>>            if (Character.isLowerCase(buf.charAt(i - 1))
> >>>>                    && Character.isUpperCase(buf.charAt(i))
> >>>>                    && Character.isLowerCase(buf.charAt(i + 1))) {
> >>>>                buf.insert(i++, '_');
> >>>>            }
> >>>>        }
> >>>>        return buf.toString().toLowerCase();
> >>>>    }
> >>>> }
> >>>>
> >>>> and added
> >>>>
> >>>> <property name="openjpa.jdbc.MappingDefaults"
> >>>>
> >>>>
> >>>>
>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
> >>>>
> >>>> to persistence.xml. However, this produces the following error:
> >>>>
> >>>> org.apache.openjpa.persistence.PersistenceException: Table/View
> >>>> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
> >>>> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
> >>>> state=42X05]
> >>>>    at
> >>>>
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>> org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>> org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
> >>>> ~[querydsl-jpa-2.6.0.jar:na]
> >>>>    at
> >>>>
> >>>>
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
> >>>> ~[querydsl-jpa-2.6.0.jar:na]
> >>>>    at
> >>>>
> >>>>
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
> >>>> ~[querydsl-jpa-2.6.0.jar:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
> >>>> [classes/:na]
> >>>>    at
> >>>>
> >>>>
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
> >>>> [test-classes/:na]
> >>>>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>>> ~[na:1.6.0_31]
> >>>>    at
> >>>>
> >>>>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >>>> ~[na:1.6.0_31]
> >>>>    at
> >>>>
> >>>>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >>>> ~[na:1.6.0_31]
> >>>>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
> >>>>    at
> >>>>
> >>>>
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> >>>> [junit-4.10.jar:na]
> >>>>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
> >>>> [junit-4.10.jar:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
> >>>> [.cp/:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> >>>> [.cp/:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> >>>> [.cp/:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> >>>> [.cp/:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> >>>> [.cp/:na]
> >>>>    at
> >>>>
> >>>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> >>>> [.cp/:na]
> >>>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
> >>>> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
> >>>> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
> >>>> WITH RR} [code=20000, state=42X05]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    at
> >>>>
> >>>>
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
> >>>> ~[openjpa-2.2.0.jar:2.2.0]
> >>>>    ... 58 common frames omitted
> >>>>
> >>>> before any tables are created. Googling says this may happen because
> >>>> SynchronizeMappings isn't set, but it is in my case:
> >>>>
> >>>> <property name="openjpa.jdbc.SynchronizeMappings"
> >>>>    value="buildSchema(ForeignKeys=true)" />
> >>>> <property name="openjpa.jdbc.DBDictionary"
> >>>>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
> >>>>
> >>>> How can I get this to work?
> >>>>
> >>>> Yours, Alexey Romanov
> >>>>
> >>>
> >>>
> >>>
> >>> --
> >>> Thanks - Dianne
> >>>
> >>
> >>
> >>
> >> --
> >> Thanks - Dianne
> >>
> >
> >
> >
> > --
> > Thanks - Dianne
> >
> >
> > ________________________________
> > If you reply to this email, your message will be added to the discussion
> > below:
> >
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580349.html
> > To unsubscribe from Change of MappingDefaults breaks
> OPENJPA_SEQUENCE_TABLE,
> > click here.
> > NAML
>
>
> --
> View this message in context:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580352.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>



-- 
Thanks - Dianne

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
Yes, that was one of things I've tried, but I much prefer lowercase
for identifiers in SQL to make it more readable :) And I've decided
that complicating my MappingDefaults for it slightly is a good
tradeoff.

One more complication was that in the OSGi setting I had to add a
fragment to the OpenJPA bundle to let it load my MappingDefaults class
and presumably the same would apply to other classes specified by
plugin strings. Perhaps OpenJPA bundle headers should include
`DynamicImport-Package: *`?

Yours, Alexey Romanov


On Wed, Jun 20, 2012 at 9:37 PM, Dianne Richards [via OpenJPA]
<ml...@n2.nabble.com> wrote:
> ok - Here's what I think you should do. First, set the delimit value to
> "false" in the newColumn() call, as I indicated in a previous post. Then,
> switch the statements for assigning validName and correctedName. Here's an
> example:
>
> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>     @Override
>     protected void correctName(Table table, Column col) {
>       DBIdentifier name =
>           DBIdentifier.newColumn(col.getIdentifier().getName(), false);
>       DBIdentifier correctedName =
>               DBIdentifier.newColumn(addUnderscores(name.getName()));
>       DBIdentifier validName = dict.getValidColumnName(correctedName,
> table);
>       col.setIdentifier(validName);
>       table.addCorrectedColumnName(validName, true);
>   }
>
> I think this change will at least allow the table to be created as you
> desire.
>
> Here's the SQL for my test:
> CREATE TABLE object_classes -- EntityWithUnderscore
>     (ID_COL INTEGER NOT NULL, NAME VARCHAR(255) NOT NULL, NAME_COL
> VARCHAR(255), PRIMARY KEY (ID_COL), CONSTRAINT U_BJCTSSS_NAME UNIQUE (NAME))
>
> I haven't tried any queries. I will if you run into later problems.
>
> Dianne
>
> On Wed, Jun 20, 2012 at 12:04 PM, Dianne Richards <[hidden email]>wrote:
>
>> Oops - I just looked more closely at the output, and it's not what you
>> want. I'll keep going.
>>
>> Dianne
>>
>>
>> On Wed, Jun 20, 2012 at 11:53 AM, Dianne Richards <[hidden email]>wrote:
>>
>>> Hi Alexey - I was able to reproduce this problem with a simple test case
>>> and debug it. I think you can get what you want by changing the following
>>> line in your ImprovedMappingDefaults:
>>>
>>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>>>
>>> Change the "true" to "false". What's happening is the true says to
>>> delimit the name, which has a rippling effect. I don't think you want
>>> this.
>>>
>>> It works on my simple test, so hopefully it will work for you.
>>>
>>> Dianne
>>>
>>>
>>> On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov <
>>> [hidden email]> wrote:
>>>
>>>> I've tried to change mapping defaults to use lowercase underscore column
>>>> names:
>>>>
>>>> package ru.focusmedia.odp.server.datastore.jpa.impl;
>>>>
>>>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
>>>> import org.apache.openjpa.jdbc.schema.Column;
>>>> import org.apache.openjpa.jdbc.schema.Table;
>>>> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>>>>
>>>> public class ImprovedMappingDefaults extends PersistenceMappingDefaults
>>>> {
>>>>    @Override
>>>>    protected void correctName(Table table, Column col) {
>>>>        DBIdentifier name =
>>>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>>>>        DBIdentifier validName = dict.getValidColumnName(name, table);
>>>>        DBIdentifier correctedName = DBIdentifier
>>>>                .newColumn(addUnderscores(validName.getName()));
>>>>        col.setIdentifier(correctedName);
>>>>        table.addCorrectedColumnName(correctedName, true);
>>>>    }
>>>>
>>>>    // taken from Hibernate's ImprovedNamingStrategy
>>>>    private static String addUnderscores(String name) {
>>>>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>>>>        for (int i = 1; i < buf.length() - 1; i++) {
>>>>            if (Character.isLowerCase(buf.charAt(i - 1))
>>>>                    && Character.isUpperCase(buf.charAt(i))
>>>>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>>>>                buf.insert(i++, '_');
>>>>            }
>>>>        }
>>>>        return buf.toString().toLowerCase();
>>>>    }
>>>> }
>>>>
>>>> and added
>>>>
>>>> <property name="openjpa.jdbc.MappingDefaults"
>>>>
>>>>
>>>>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>>>>
>>>> to persistence.xml. However, this produces the following error:
>>>>
>>>> org.apache.openjpa.persistence.PersistenceException: Table/View
>>>> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
>>>> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
>>>> state=42X05]
>>>>    at
>>>> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>> org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>> org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
>>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>>    at
>>>>
>>>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
>>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>>    at
>>>>
>>>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
>>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
>>>> [classes/:na]
>>>>    at
>>>>
>>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
>>>> [test-classes/:na]
>>>>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>> ~[na:1.6.0_31]
>>>>    at
>>>>
>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>> ~[na:1.6.0_31]
>>>>    at
>>>>
>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>> ~[na:1.6.0_31]
>>>>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>>>>    at
>>>>
>>>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>>>> [junit-4.10.jar:na]
>>>>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>>>> [junit-4.10.jar:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>>>> [.cp/:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>>> [.cp/:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>>>> [.cp/:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>>>> [.cp/:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>>>> [.cp/:na]
>>>>    at
>>>>
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>>>> [.cp/:na]
>>>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
>>>> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
>>>> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
>>>> WITH RR} [code=20000, state=42X05]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    at
>>>>
>>>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
>>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>>    ... 58 common frames omitted
>>>>
>>>> before any tables are created. Googling says this may happen because
>>>> SynchronizeMappings isn't set, but it is in my case:
>>>>
>>>> <property name="openjpa.jdbc.SynchronizeMappings"
>>>>    value="buildSchema(ForeignKeys=true)" />
>>>> <property name="openjpa.jdbc.DBDictionary"
>>>>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>>>>
>>>> How can I get this to work?
>>>>
>>>> Yours, Alexey Romanov
>>>>
>>>
>>>
>>>
>>> --
>>> Thanks - Dianne
>>>
>>
>>
>>
>> --
>> Thanks - Dianne
>>
>
>
>
> --
> Thanks - Dianne
>
>
> ________________________________
> If you reply to this email, your message will be added to the discussion
> below:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580349.html
> To unsubscribe from Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE,
> click here.
> NAML


--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580352.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Dianne Richards <di...@gmail.com>.
ok - Here's what I think you should do. First, set the delimit value to
"false" in the newColumn() call, as I indicated in a previous post. Then,
switch the statements for assigning validName and correctedName. Here's an
example:

public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
    @Override
    protected void correctName(Table table, Column col) {
      DBIdentifier name =
          DBIdentifier.newColumn(col.getIdentifier().getName(), false);
      DBIdentifier correctedName =
              DBIdentifier.newColumn(addUnderscores(name.getName()));
      DBIdentifier validName = dict.getValidColumnName(correctedName,
table);
      col.setIdentifier(validName);
      table.addCorrectedColumnName(validName, true);
  }

I think this change will at least allow the table to be created as you
desire.

Here's the SQL for my test:
CREATE TABLE object_classes -- EntityWithUnderscore
    (ID_COL INTEGER NOT NULL, NAME VARCHAR(255) NOT NULL, NAME_COL
VARCHAR(255), PRIMARY KEY (ID_COL), CONSTRAINT U_BJCTSSS_NAME UNIQUE (NAME))

I haven't tried any queries. I will if you run into later problems.

Dianne

On Wed, Jun 20, 2012 at 12:04 PM, Dianne Richards <di...@gmail.com>wrote:

> Oops - I just looked more closely at the output, and it's not what you
> want. I'll keep going.
>
> Dianne
>
>
> On Wed, Jun 20, 2012 at 11:53 AM, Dianne Richards <di...@gmail.com>wrote:
>
>> Hi Alexey - I was able to reproduce this problem with a simple test case
>> and debug it. I think you can get what you want by changing the following
>> line in your ImprovedMappingDefaults:
>>
>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>>
>> Change the "true" to "false". What's happening is the true says to
>> delimit the name, which has a rippling effect. I don't think you want this.
>>
>> It works on my simple test, so hopefully it will work for you.
>>
>> Dianne
>>
>>
>> On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov <
>> alexey.v.romanov@gmail.com> wrote:
>>
>>> I've tried to change mapping defaults to use lowercase underscore column
>>> names:
>>>
>>> package ru.focusmedia.odp.server.datastore.jpa.impl;
>>>
>>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
>>> import org.apache.openjpa.jdbc.schema.Column;
>>> import org.apache.openjpa.jdbc.schema.Table;
>>> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>>>
>>> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>>>    @Override
>>>    protected void correctName(Table table, Column col) {
>>>        DBIdentifier name =
>>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>>>        DBIdentifier validName = dict.getValidColumnName(name, table);
>>>        DBIdentifier correctedName = DBIdentifier
>>>                .newColumn(addUnderscores(validName.getName()));
>>>        col.setIdentifier(correctedName);
>>>        table.addCorrectedColumnName(correctedName, true);
>>>    }
>>>
>>>    // taken from Hibernate's ImprovedNamingStrategy
>>>    private static String addUnderscores(String name) {
>>>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>>>        for (int i = 1; i < buf.length() - 1; i++) {
>>>            if (Character.isLowerCase(buf.charAt(i - 1))
>>>                    && Character.isUpperCase(buf.charAt(i))
>>>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>>>                buf.insert(i++, '_');
>>>            }
>>>        }
>>>        return buf.toString().toLowerCase();
>>>    }
>>> }
>>>
>>> and added
>>>
>>> <property name="openjpa.jdbc.MappingDefaults"
>>>
>>>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>>>
>>> to persistence.xml. However, this produces the following error:
>>>
>>> org.apache.openjpa.persistence.PersistenceException: Table/View
>>> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
>>> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
>>> state=42X05]
>>>    at
>>> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>    at
>>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>    at
>>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
>>> ~[querydsl-jpa-2.6.0.jar:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
>>> [classes/:na]
>>>    at
>>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
>>> [test-classes/:na]
>>>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> ~[na:1.6.0_31]
>>>    at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> ~[na:1.6.0_31]
>>>    at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> ~[na:1.6.0_31]
>>>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>>>    at
>>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>>> [junit-4.10.jar:na]
>>>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>>> [junit-4.10.jar:na]
>>>    at
>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>>> [.cp/:na]
>>>    at
>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>> [.cp/:na]
>>>    at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>>> [.cp/:na]
>>>    at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>>> [.cp/:na]
>>>    at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>>> [.cp/:na]
>>>    at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>>> [.cp/:na]
>>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
>>> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
>>> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
>>> WITH RR} [code=20000, state=42X05]
>>>    at
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    at
>>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
>>> ~[openjpa-2.2.0.jar:2.2.0]
>>>    ... 58 common frames omitted
>>>
>>> before any tables are created. Googling says this may happen because
>>> SynchronizeMappings isn't set, but it is in my case:
>>>
>>> <property name="openjpa.jdbc.SynchronizeMappings"
>>>    value="buildSchema(ForeignKeys=true)" />
>>> <property name="openjpa.jdbc.DBDictionary"
>>>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>>>
>>> How can I get this to work?
>>>
>>> Yours, Alexey Romanov
>>>
>>
>>
>>
>> --
>> Thanks - Dianne
>>
>
>
>
> --
> Thanks - Dianne
>



-- 
Thanks - Dianne

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Dianne Richards <di...@gmail.com>.
Oops - I just looked more closely at the output, and it's not what you
want. I'll keep going.

Dianne

On Wed, Jun 20, 2012 at 11:53 AM, Dianne Richards <di...@gmail.com>wrote:

> Hi Alexey - I was able to reproduce this problem with a simple test case
> and debug it. I think you can get what you want by changing the following
> line in your ImprovedMappingDefaults:
>
> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>
> Change the "true" to "false". What's happening is the true says to delimit
> the name, which has a rippling effect. I don't think you want this.
>
> It works on my simple test, so hopefully it will work for you.
>
> Dianne
>
>
> On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov <alexey.v.romanov@gmail.com
> > wrote:
>
>> I've tried to change mapping defaults to use lowercase underscore column
>> names:
>>
>> package ru.focusmedia.odp.server.datastore.jpa.impl;
>>
>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
>> import org.apache.openjpa.jdbc.schema.Column;
>> import org.apache.openjpa.jdbc.schema.Table;
>> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>>
>> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>>    @Override
>>    protected void correctName(Table table, Column col) {
>>        DBIdentifier name =
>> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>>        DBIdentifier validName = dict.getValidColumnName(name, table);
>>        DBIdentifier correctedName = DBIdentifier
>>                .newColumn(addUnderscores(validName.getName()));
>>        col.setIdentifier(correctedName);
>>        table.addCorrectedColumnName(correctedName, true);
>>    }
>>
>>    // taken from Hibernate's ImprovedNamingStrategy
>>    private static String addUnderscores(String name) {
>>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>>        for (int i = 1; i < buf.length() - 1; i++) {
>>            if (Character.isLowerCase(buf.charAt(i - 1))
>>                    && Character.isUpperCase(buf.charAt(i))
>>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>>                buf.insert(i++, '_');
>>            }
>>        }
>>        return buf.toString().toLowerCase();
>>    }
>> }
>>
>> and added
>>
>> <property name="openjpa.jdbc.MappingDefaults"
>>
>>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>>
>> to persistence.xml. However, this produces the following error:
>>
>> org.apache.openjpa.persistence.PersistenceException: Table/View
>> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
>> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
>> state=42X05]
>>    at
>> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
>> ~[querydsl-jpa-2.6.0.jar:na]
>>    at
>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
>> ~[querydsl-jpa-2.6.0.jar:na]
>>    at
>> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
>> ~[querydsl-jpa-2.6.0.jar:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
>> [classes/:na]
>>    at
>> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
>> [test-classes/:na]
>>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> ~[na:1.6.0_31]
>>    at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> ~[na:1.6.0_31]
>>    at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> ~[na:1.6.0_31]
>>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>>    at
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>> [junit-4.10.jar:na]
>>    at
>> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
>> [junit-4.10.jar:na]
>>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>> [junit-4.10.jar:na]
>>    at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>> [.cp/:na]
>>    at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> [.cp/:na]
>>    at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>> [.cp/:na]
>>    at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>> [.cp/:na]
>>    at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>> [.cp/:na]
>>    at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>> [.cp/:na]
>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
>> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
>> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
>> WITH RR} [code=20000, state=42X05]
>>    at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    at
>> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
>> ~[openjpa-2.2.0.jar:2.2.0]
>>    ... 58 common frames omitted
>>
>> before any tables are created. Googling says this may happen because
>> SynchronizeMappings isn't set, but it is in my case:
>>
>> <property name="openjpa.jdbc.SynchronizeMappings"
>>    value="buildSchema(ForeignKeys=true)" />
>> <property name="openjpa.jdbc.DBDictionary"
>>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>>
>> How can I get this to work?
>>
>> Yours, Alexey Romanov
>>
>
>
>
> --
> Thanks - Dianne
>



-- 
Thanks - Dianne

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Dianne Richards <di...@gmail.com>.
Hi Alexey - I was able to reproduce this problem with a simple test case
and debug it. I think you can get what you want by changing the following
line in your ImprovedMappingDefaults:

DBIdentifier.newColumn(col.getIdentifier().getName(), true);

Change the "true" to "false". What's happening is the true says to delimit
the name, which has a rippling effect. I don't think you want this.

It works on my simple test, so hopefully it will work for you.

Dianne

On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov
<al...@gmail.com>wrote:

> I've tried to change mapping defaults to use lowercase underscore column
> names:
>
> package ru.focusmedia.odp.server.datastore.jpa.impl;
>
> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
> import org.apache.openjpa.jdbc.schema.Column;
> import org.apache.openjpa.jdbc.schema.Table;
> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>
> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>    @Override
>    protected void correctName(Table table, Column col) {
>        DBIdentifier name =
> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>        DBIdentifier validName = dict.getValidColumnName(name, table);
>        DBIdentifier correctedName = DBIdentifier
>                .newColumn(addUnderscores(validName.getName()));
>        col.setIdentifier(correctedName);
>        table.addCorrectedColumnName(correctedName, true);
>    }
>
>    // taken from Hibernate's ImprovedNamingStrategy
>    private static String addUnderscores(String name) {
>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>        for (int i = 1; i < buf.length() - 1; i++) {
>            if (Character.isLowerCase(buf.charAt(i - 1))
>                    && Character.isUpperCase(buf.charAt(i))
>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>                buf.insert(i++, '_');
>            }
>        }
>        return buf.toString().toLowerCase();
>    }
> }
>
> and added
>
> <property name="openjpa.jdbc.MappingDefaults"
>
>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>
> to persistence.xml. However, this produces the following error:
>
> org.apache.openjpa.persistence.PersistenceException: Table/View
> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
> state=42X05]
>    at
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
> [test-classes/:na]
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> ~[na:1.6.0_31]
>    at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> ~[na:1.6.0_31]
>    at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> ~[na:1.6.0_31]
>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>    at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
> [junit-4.10.jar:na]
>    at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> [.cp/:na]
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
> WITH RR} [code=20000, state=42X05]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
> ~[openjpa-2.2.0.jar:2.2.0]
>    ... 58 common frames omitted
>
> before any tables are created. Googling says this may happen because
> SynchronizeMappings isn't set, but it is in my case:
>
> <property name="openjpa.jdbc.SynchronizeMappings"
>    value="buildSchema(ForeignKeys=true)" />
> <property name="openjpa.jdbc.DBDictionary"
>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>
> How can I get this to work?
>
> Yours, Alexey Romanov
>



-- 
Thanks - Dianne

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
No, I've checked and it doesn't. DBIdentifierUtilImpl.makeIdentifierValid
doesn't check for it. The relevant part is at the end:
        
        if (validName.isDelimited()) {
            String delimCase =
getIdentifierConfiguration().getDelimitedCase();
            if (delimCase.equals(CASE_LOWER)) {
                return DBIdentifier.toLower(validName,true);
            }
            else if (delimCase.equals(CASE_UPPER)) {
                return DBIdentifier.toUpper(validName,true);
            }
            else {
                return validName;
            }
        }
        return DBIdentifier.toUpper(validName);

Of course, I could avoid calling dict.getValidColumnName in my
ImprovedMappingDefaults, but I don't think that's ideal.

--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580294.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Dianne Richards <di...@gmail.com>.
Alexy - I've been asked to look into this. I don't have a lot of time now
to dig into it. But, a quick look makes me wonder if you could fix this by
using the DBDictionary property "schemaCase".  The default value is
"upper". I think you want to use "preserve". I see you've used a dictionary
property, so you should be able to figure this out. If that doesn't work,
I'll look into this further tomorrow.

Dianne

On Wed, Jun 13, 2012 at 3:09 PM, Alexey Romanov
<al...@gmail.com>wrote:

> It turned out the whole problem was not being able to find "version".
> I still don't understand why I didn't see that exception in the
> console, and I am quite sure it wasn't there (even with all log levels
> set to Trace). After failing to find it, OpenJPA didn't create any
> tables (including OPENJPA_SEQUENCE_TABLE), and OPENJPA_SEQUENCE_TABLE
> simply happened to be the first table it queried in my test.
>
> Stripping delimiters later was done for two reasons: 1) better looking
> generated SQL; 2) going back to @UniqueConstraint(columnNames = {
> "name", "version" })).
>
> What's the reasoning for DBIdentifierUtilImpl.makeIdentifierValid
> uppercasing all non-delimited identifiers, by the way?
>
> On Wed, Jun 13, 2012 at 11:26 PM, Kevin Sutter [via OpenJPA]
> <ml...@n2.nabble.com> wrote:
> > Thanks, Alexey, for your debugging efforts.  This seems to indicate an
> > issue with our delimited identifier support.  One clarification, when you
> > said that changing the UniqueConstraint fixed the problem, did you mean
> > just the JUnit exception that you posted about not able to find
> "version",
> > or did it fix both of your issues?
> >
> > @UniqueConstraint(columnNames = { "name", "\"version\"" }))
> >
> > I'm assuming it only resolved the JUnit exception since you still had to
> > hack another solution with stripping the delimiters...
> >
> > Thanks,
> > Kevin
> >
> > On Wed, Jun 13, 2012 at 3:00 AM, Alexey Romanov
> > <[hidden email]>wrote:
> >
> >> So the problem is that if I don't delimit column names,
> >> DBIdentifierUtilImpl.makeIdentifierValid (called from
> >> dict.getValidColumnName) will  convert them to upper case, whether I
> want
> >> it
> >> or not. The ugly solution I came up with is to delimit them and strip
> the
> >> delimiters later. Unfortunately, this leads to code duplication :( This
> is
> >> what I have at the moment:
> >>
> >>
> >> package ru.focusmedia.odp.server.datastore.jpa.impl;
> >>
> >> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
> >> import org.apache.openjpa.jdbc.identifier.Normalizer;
> >> import org.apache.openjpa.jdbc.meta.FieldMapping;
> >> import org.apache.openjpa.jdbc.meta.ValueMapping;
> >> import org.apache.openjpa.jdbc.schema.Column;
> >> import org.apache.openjpa.jdbc.schema.Table;
> >> import org.apache.openjpa.meta.JavaTypes;
> >> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
> >>
> >> public class ImprovedMappingDefaults extends PersistenceMappingDefaults
> {
> >>        @Override
> >>        protected void correctName(Table table, Column col) {
> >>                 String originalName = col.getIdentifier().getName();
> >>                boolean wasOriginallyDelimited =
> >> Normalizer.isDelimited(originalName);
> >>                DBIdentifier name = DBIdentifier.newColumn(originalName,
> >>                                !wasOriginallyDelimited);
> >>                 DBIdentifier validName = dict.getValidColumnName(name,
> >> table);
> >>                 validName = addUnderscores(validName,
> >> wasOriginallyDelimited);
> >>                col.setIdentifier(validName);
> >>                table.addCorrectedColumnName(validName, true);
> >>        }
> >>
> >>        @Override
> >>        public void populateJoinColumn(FieldMapping fm, Table local,
> Table
> >> foreign,
> >>                        Column col, Object target, int pos, int cols) {
> >>                if (!(target instanceof Column))
> >>                        return;
> >>
> >>                // if this is a bidi relation, prefix with inverse field
> >> name, else
> >>                // prefix with owning entity name
> >>                FieldMapping[] inverses = fm.getInverseMappings();
> >>                DBIdentifier sName = DBIdentifier.NULL;
> >>                String originalName = inverses.length > 0 ?
> >> inverses[0].getName() : fm
> >>                                .getDefiningMapping().getTypeAlias();
> >>                boolean wasOriginallyDelimited =
> >> Normalizer.isDelimited(originalName);
> >>                sName = DBIdentifier.newColumn(originalName,
> >> !wasOriginallyDelimited);
> >>                DBIdentifier targetName = ((Column)
> >> target).getIdentifier();
> >>                DBIdentifier tempName = DBIdentifier.NULL;
> >>                if ((sName.length() + targetName.length()) >=
> >> dict.maxColumnNameLength) {
> >>                        tempName = DBIdentifier.truncate(sName,
> >> dict.maxColumnNameLength
> >>                                        - targetName.length() - 1);
> >>                }
> >>                // suffix with '_' + target column
> >>                if (DBIdentifier.isNull(tempName))
> >>                        tempName = sName;
> >>                sName = DBIdentifier.combine(tempName,
> >> targetName.getName());
> >>                sName = dict.getValidColumnName(sName, foreign);
> >>                sName = addUnderscores(sName, wasOriginallyDelimited);
> >>                col.setIdentifier(sName);
> >>        }
> >>
> >>    @Override
> >>        public void populateForeignKeyColumn(ValueMapping vm,
> DBIdentifier
> >> sName,
> >>            Table local, Table foreign, Column col, Object target,
> boolean
> >> inverse,
> >>            int pos, int cols) {
> >>            boolean elem = vm == vm.getFieldMapping().getElement()
> >>                && vm.getFieldMapping().getTypeCode() != JavaTypes.MAP;
> >>
> >>            // if this is a non-inverse collection element key, it must
> be
> >> in
> >>            // a join table: if we're not prepending the field name,
> leave
> >> the
> >>            // default
> >>            if (!getPrependFieldNameToJoinTableInverseJoinColumns() &&
> >> !inverse && elem)
> >>                return;
> >>
> >>            // otherwise jpa always uses <field>_<pkcol> for column name,
> >> even
> >>            // when only one col
> >>            if (target instanceof Column) {
> >>                if (DBIdentifier.isNull(sName)) {
> >>                    sName = col.getIdentifier();
> >>                } else {
> >>                        String originalName = elem ?
> >> vm.getFieldMapping().getName() :
> >> Normalizer.removeHungarianNotation(sName.getName());
> >>                        boolean wasOriginallyDelimited =
> >> Normalizer.isDelimited(originalName);
> >>                        sName = DBIdentifier.newColumn(originalName,
> >> !wasOriginallyDelimited);
> >>                    sName = DBIdentifier.combine(sName,
> >> ((Column)target).getIdentifier().getName());
> >>
> >>                    // No need to check for uniqueness.
> >>                    sName = dict.getValidColumnName(sName, local, false);
> >>                        sName = addUnderscores(sName,
> >> wasOriginallyDelimited);
> >>               }
> >>                col.setIdentifier(sName);
> >>            }
> >>        }
> >>
> >>        private DBIdentifier addUnderscores(DBIdentifier sName,
> >>                        boolean wasOriginallyDelimited) {
> >>                String nameWithUnderscores =
> >> addUnderscores(sName.getName());
> >>                if (!wasOriginallyDelimited) {
> >>                        nameWithUnderscores = Normalizer
> >>
> >>  .removeDelimiters(nameWithUnderscores);
> >>                }
> >>                sName = DBIdentifier.newColumn(nameWithUnderscores,
> false);
> >>                return sName;
> >>         }
> >>
> >>        // taken from Hibernate's ImprovedNamingStrategy
> >>        private static String addUnderscores(String name) {
> >>                 StringBuilder buf = new StringBuilder(name.replace('.',
> >> '_'));
> >>                 for (int i = 1; i < buf.length() - 1; i++) {
> >>                        if (Character.isLowerCase(buf.charAt(i - 1))
> >>                                        &&
> >> Character.isUpperCase(buf.charAt(i))
> >>                                        &&
> >> Character.isLowerCase(buf.charAt(i + 1))) {
> >>                                buf.insert(i++, '_');
> >>                        }
> >>                }
> >>                return buf.toString().toLowerCase();
> >>        }
> >> }
> >>
> >>
> >> --
> >> View this message in context:
> >>
> >>
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580270.html
> >> Sent from the OpenJPA Users mailing list archive at Nabble.com.
> >>
> >
> >
> > ________________________________
> > If you reply to this email, your message will be added to the discussion
> > below:
> >
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580279.html
> > To unsubscribe from Change of MappingDefaults breaks
> OPENJPA_SEQUENCE_TABLE,
> > click here.
> > NAML
>
>
> --
> View this message in context:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580281.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>



-- 
Thanks - Dianne

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
It turned out the whole problem was not being able to find "version".
I still don't understand why I didn't see that exception in the
console, and I am quite sure it wasn't there (even with all log levels
set to Trace). After failing to find it, OpenJPA didn't create any
tables (including OPENJPA_SEQUENCE_TABLE), and OPENJPA_SEQUENCE_TABLE
simply happened to be the first table it queried in my test.

Stripping delimiters later was done for two reasons: 1) better looking
generated SQL; 2) going back to @UniqueConstraint(columnNames = {
"name", "version" })).

What's the reasoning for DBIdentifierUtilImpl.makeIdentifierValid
uppercasing all non-delimited identifiers, by the way?

On Wed, Jun 13, 2012 at 11:26 PM, Kevin Sutter [via OpenJPA]
<ml...@n2.nabble.com> wrote:
> Thanks, Alexey, for your debugging efforts.  This seems to indicate an
> issue with our delimited identifier support.  One clarification, when you
> said that changing the UniqueConstraint fixed the problem, did you mean
> just the JUnit exception that you posted about not able to find "version",
> or did it fix both of your issues?
>
> @UniqueConstraint(columnNames = { "name", "\"version\"" }))
>
> I'm assuming it only resolved the JUnit exception since you still had to
> hack another solution with stripping the delimiters...
>
> Thanks,
> Kevin
>
> On Wed, Jun 13, 2012 at 3:00 AM, Alexey Romanov
> <[hidden email]>wrote:
>
>> So the problem is that if I don't delimit column names,
>> DBIdentifierUtilImpl.makeIdentifierValid (called from
>> dict.getValidColumnName) will  convert them to upper case, whether I want
>> it
>> or not. The ugly solution I came up with is to delimit them and strip the
>> delimiters later. Unfortunately, this leads to code duplication :( This is
>> what I have at the moment:
>>
>>
>> package ru.focusmedia.odp.server.datastore.jpa.impl;
>>
>> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
>> import org.apache.openjpa.jdbc.identifier.Normalizer;
>> import org.apache.openjpa.jdbc.meta.FieldMapping;
>> import org.apache.openjpa.jdbc.meta.ValueMapping;
>> import org.apache.openjpa.jdbc.schema.Column;
>> import org.apache.openjpa.jdbc.schema.Table;
>> import org.apache.openjpa.meta.JavaTypes;
>> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>>
>> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>>        @Override
>>        protected void correctName(Table table, Column col) {
>>                 String originalName = col.getIdentifier().getName();
>>                boolean wasOriginallyDelimited =
>> Normalizer.isDelimited(originalName);
>>                DBIdentifier name = DBIdentifier.newColumn(originalName,
>>                                !wasOriginallyDelimited);
>>                 DBIdentifier validName = dict.getValidColumnName(name,
>> table);
>>                 validName = addUnderscores(validName,
>> wasOriginallyDelimited);
>>                col.setIdentifier(validName);
>>                table.addCorrectedColumnName(validName, true);
>>        }
>>
>>        @Override
>>        public void populateJoinColumn(FieldMapping fm, Table local, Table
>> foreign,
>>                        Column col, Object target, int pos, int cols) {
>>                if (!(target instanceof Column))
>>                        return;
>>
>>                // if this is a bidi relation, prefix with inverse field
>> name, else
>>                // prefix with owning entity name
>>                FieldMapping[] inverses = fm.getInverseMappings();
>>                DBIdentifier sName = DBIdentifier.NULL;
>>                String originalName = inverses.length > 0 ?
>> inverses[0].getName() : fm
>>                                .getDefiningMapping().getTypeAlias();
>>                boolean wasOriginallyDelimited =
>> Normalizer.isDelimited(originalName);
>>                sName = DBIdentifier.newColumn(originalName,
>> !wasOriginallyDelimited);
>>                DBIdentifier targetName = ((Column)
>> target).getIdentifier();
>>                DBIdentifier tempName = DBIdentifier.NULL;
>>                if ((sName.length() + targetName.length()) >=
>> dict.maxColumnNameLength) {
>>                        tempName = DBIdentifier.truncate(sName,
>> dict.maxColumnNameLength
>>                                        - targetName.length() - 1);
>>                }
>>                // suffix with '_' + target column
>>                if (DBIdentifier.isNull(tempName))
>>                        tempName = sName;
>>                sName = DBIdentifier.combine(tempName,
>> targetName.getName());
>>                sName = dict.getValidColumnName(sName, foreign);
>>                sName = addUnderscores(sName, wasOriginallyDelimited);
>>                col.setIdentifier(sName);
>>        }
>>
>>    @Override
>>        public void populateForeignKeyColumn(ValueMapping vm, DBIdentifier
>> sName,
>>            Table local, Table foreign, Column col, Object target, boolean
>> inverse,
>>            int pos, int cols) {
>>            boolean elem = vm == vm.getFieldMapping().getElement()
>>                && vm.getFieldMapping().getTypeCode() != JavaTypes.MAP;
>>
>>            // if this is a non-inverse collection element key, it must be
>> in
>>            // a join table: if we're not prepending the field name, leave
>> the
>>            // default
>>            if (!getPrependFieldNameToJoinTableInverseJoinColumns() &&
>> !inverse && elem)
>>                return;
>>
>>            // otherwise jpa always uses <field>_<pkcol> for column name,
>> even
>>            // when only one col
>>            if (target instanceof Column) {
>>                if (DBIdentifier.isNull(sName)) {
>>                    sName = col.getIdentifier();
>>                } else {
>>                        String originalName = elem ?
>> vm.getFieldMapping().getName() :
>> Normalizer.removeHungarianNotation(sName.getName());
>>                        boolean wasOriginallyDelimited =
>> Normalizer.isDelimited(originalName);
>>                        sName = DBIdentifier.newColumn(originalName,
>> !wasOriginallyDelimited);
>>                    sName = DBIdentifier.combine(sName,
>> ((Column)target).getIdentifier().getName());
>>
>>                    // No need to check for uniqueness.
>>                    sName = dict.getValidColumnName(sName, local, false);
>>                        sName = addUnderscores(sName,
>> wasOriginallyDelimited);
>>               }
>>                col.setIdentifier(sName);
>>            }
>>        }
>>
>>        private DBIdentifier addUnderscores(DBIdentifier sName,
>>                        boolean wasOriginallyDelimited) {
>>                String nameWithUnderscores =
>> addUnderscores(sName.getName());
>>                if (!wasOriginallyDelimited) {
>>                        nameWithUnderscores = Normalizer
>>
>>  .removeDelimiters(nameWithUnderscores);
>>                }
>>                sName = DBIdentifier.newColumn(nameWithUnderscores, false);
>>                return sName;
>>         }
>>
>>        // taken from Hibernate's ImprovedNamingStrategy
>>        private static String addUnderscores(String name) {
>>                 StringBuilder buf = new StringBuilder(name.replace('.',
>> '_'));
>>                 for (int i = 1; i < buf.length() - 1; i++) {
>>                        if (Character.isLowerCase(buf.charAt(i - 1))
>>                                        &&
>> Character.isUpperCase(buf.charAt(i))
>>                                        &&
>> Character.isLowerCase(buf.charAt(i + 1))) {
>>                                buf.insert(i++, '_');
>>                        }
>>                }
>>                return buf.toString().toLowerCase();
>>        }
>> }
>>
>>
>> --
>> View this message in context:
>>
>> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580270.html
>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>
>
>
> ________________________________
> If you reply to this email, your message will be added to the discussion
> below:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580279.html
> To unsubscribe from Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE,
> click here.
> NAML


--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580281.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Kevin Sutter <kw...@gmail.com>.
Thanks, Alexey, for your debugging efforts.  This seems to indicate an
issue with our delimited identifier support.  One clarification, when you
said that changing the UniqueConstraint fixed the problem, did you mean
just the JUnit exception that you posted about not able to find "version",
or did it fix both of your issues?

@UniqueConstraint(columnNames = { "name", "\"version\"" }))

I'm assuming it only resolved the JUnit exception since you still had to
hack another solution with stripping the delimiters...

Thanks,
Kevin

On Wed, Jun 13, 2012 at 3:00 AM, Alexey Romanov
<al...@gmail.com>wrote:

> So the problem is that if I don't delimit column names,
> DBIdentifierUtilImpl.makeIdentifierValid (called from
> dict.getValidColumnName) will  convert them to upper case, whether I want
> it
> or not. The ugly solution I came up with is to delimit them and strip the
> delimiters later. Unfortunately, this leads to code duplication :( This is
> what I have at the moment:
>
>
> package ru.focusmedia.odp.server.datastore.jpa.impl;
>
> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
> import org.apache.openjpa.jdbc.identifier.Normalizer;
> import org.apache.openjpa.jdbc.meta.FieldMapping;
> import org.apache.openjpa.jdbc.meta.ValueMapping;
> import org.apache.openjpa.jdbc.schema.Column;
> import org.apache.openjpa.jdbc.schema.Table;
> import org.apache.openjpa.meta.JavaTypes;
> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>
> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>        @Override
>        protected void correctName(Table table, Column col) {
>                 String originalName = col.getIdentifier().getName();
>                boolean wasOriginallyDelimited =
> Normalizer.isDelimited(originalName);
>                DBIdentifier name = DBIdentifier.newColumn(originalName,
>                                !wasOriginallyDelimited);
>                 DBIdentifier validName = dict.getValidColumnName(name,
> table);
>                 validName = addUnderscores(validName,
> wasOriginallyDelimited);
>                col.setIdentifier(validName);
>                table.addCorrectedColumnName(validName, true);
>        }
>
>        @Override
>        public void populateJoinColumn(FieldMapping fm, Table local, Table
> foreign,
>                        Column col, Object target, int pos, int cols) {
>                if (!(target instanceof Column))
>                        return;
>
>                // if this is a bidi relation, prefix with inverse field
> name, else
>                // prefix with owning entity name
>                FieldMapping[] inverses = fm.getInverseMappings();
>                DBIdentifier sName = DBIdentifier.NULL;
>                String originalName = inverses.length > 0 ?
> inverses[0].getName() : fm
>                                .getDefiningMapping().getTypeAlias();
>                boolean wasOriginallyDelimited =
> Normalizer.isDelimited(originalName);
>                sName = DBIdentifier.newColumn(originalName,
> !wasOriginallyDelimited);
>                DBIdentifier targetName = ((Column) target).getIdentifier();
>                DBIdentifier tempName = DBIdentifier.NULL;
>                if ((sName.length() + targetName.length()) >=
> dict.maxColumnNameLength) {
>                        tempName = DBIdentifier.truncate(sName,
> dict.maxColumnNameLength
>                                        - targetName.length() - 1);
>                }
>                // suffix with '_' + target column
>                if (DBIdentifier.isNull(tempName))
>                        tempName = sName;
>                sName = DBIdentifier.combine(tempName,
> targetName.getName());
>                sName = dict.getValidColumnName(sName, foreign);
>                sName = addUnderscores(sName, wasOriginallyDelimited);
>                col.setIdentifier(sName);
>        }
>
>    @Override
>        public void populateForeignKeyColumn(ValueMapping vm, DBIdentifier
> sName,
>            Table local, Table foreign, Column col, Object target, boolean
> inverse,
>            int pos, int cols) {
>            boolean elem = vm == vm.getFieldMapping().getElement()
>                && vm.getFieldMapping().getTypeCode() != JavaTypes.MAP;
>
>            // if this is a non-inverse collection element key, it must be
> in
>            // a join table: if we're not prepending the field name, leave
> the
>            // default
>            if (!getPrependFieldNameToJoinTableInverseJoinColumns() &&
> !inverse && elem)
>                return;
>
>            // otherwise jpa always uses <field>_<pkcol> for column name,
> even
>            // when only one col
>            if (target instanceof Column) {
>                if (DBIdentifier.isNull(sName)) {
>                    sName = col.getIdentifier();
>                } else {
>                        String originalName = elem ?
> vm.getFieldMapping().getName() :
> Normalizer.removeHungarianNotation(sName.getName());
>                        boolean wasOriginallyDelimited =
> Normalizer.isDelimited(originalName);
>                        sName = DBIdentifier.newColumn(originalName,
> !wasOriginallyDelimited);
>                    sName = DBIdentifier.combine(sName,
> ((Column)target).getIdentifier().getName());
>
>                    // No need to check for uniqueness.
>                    sName = dict.getValidColumnName(sName, local, false);
>                        sName = addUnderscores(sName,
> wasOriginallyDelimited);
>               }
>                col.setIdentifier(sName);
>            }
>        }
>
>        private DBIdentifier addUnderscores(DBIdentifier sName,
>                        boolean wasOriginallyDelimited) {
>                String nameWithUnderscores =
> addUnderscores(sName.getName());
>                if (!wasOriginallyDelimited) {
>                        nameWithUnderscores = Normalizer
>
>  .removeDelimiters(nameWithUnderscores);
>                }
>                sName = DBIdentifier.newColumn(nameWithUnderscores, false);
>                return sName;
>         }
>
>        // taken from Hibernate's ImprovedNamingStrategy
>        private static String addUnderscores(String name) {
>                 StringBuilder buf = new StringBuilder(name.replace('.',
> '_'));
>                 for (int i = 1; i < buf.length() - 1; i++) {
>                        if (Character.isLowerCase(buf.charAt(i - 1))
>                                        &&
> Character.isUpperCase(buf.charAt(i))
>                                        &&
> Character.isLowerCase(buf.charAt(i + 1))) {
>                                buf.insert(i++, '_');
>                        }
>                }
>                return buf.toString().toLowerCase();
>        }
> }
>
>
> --
> View this message in context:
> http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580270.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
So the problem is that if I don't delimit column names,
DBIdentifierUtilImpl.makeIdentifierValid (called from
dict.getValidColumnName) will  convert them to upper case, whether I want it
or not. The ugly solution I came up with is to delimit them and strip the
delimiters later. Unfortunately, this leads to code duplication :( This is
what I have at the moment:


package ru.focusmedia.odp.server.datastore.jpa.impl;

import org.apache.openjpa.jdbc.identifier.DBIdentifier;
import org.apache.openjpa.jdbc.identifier.Normalizer;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.meta.ValueMapping;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Table;
import org.apache.openjpa.meta.JavaTypes;
import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;

public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
	@Override
	protected void correctName(Table table, Column col) {
		String originalName = col.getIdentifier().getName();
		boolean wasOriginallyDelimited = Normalizer.isDelimited(originalName);
		DBIdentifier name = DBIdentifier.newColumn(originalName,
				!wasOriginallyDelimited);
		DBIdentifier validName = dict.getValidColumnName(name, table);
		validName = addUnderscores(validName, wasOriginallyDelimited);
		col.setIdentifier(validName);
		table.addCorrectedColumnName(validName, true);
	}

	@Override
	public void populateJoinColumn(FieldMapping fm, Table local, Table foreign,
			Column col, Object target, int pos, int cols) {
		if (!(target instanceof Column))
			return;

		// if this is a bidi relation, prefix with inverse field name, else
		// prefix with owning entity name
		FieldMapping[] inverses = fm.getInverseMappings();
		DBIdentifier sName = DBIdentifier.NULL;
		String originalName = inverses.length > 0 ? inverses[0].getName() : fm
				.getDefiningMapping().getTypeAlias();
		boolean wasOriginallyDelimited = Normalizer.isDelimited(originalName);
		sName = DBIdentifier.newColumn(originalName, !wasOriginallyDelimited);
		DBIdentifier targetName = ((Column) target).getIdentifier();
		DBIdentifier tempName = DBIdentifier.NULL;
		if ((sName.length() + targetName.length()) >= dict.maxColumnNameLength) {
			tempName = DBIdentifier.truncate(sName, dict.maxColumnNameLength
					- targetName.length() - 1);
		}
		// suffix with '_' + target column
		if (DBIdentifier.isNull(tempName))
			tempName = sName;
		sName = DBIdentifier.combine(tempName, targetName.getName());
		sName = dict.getValidColumnName(sName, foreign);
		sName = addUnderscores(sName, wasOriginallyDelimited);
		col.setIdentifier(sName);
	}

    @Override
	public void populateForeignKeyColumn(ValueMapping vm, DBIdentifier sName,
            Table local, Table foreign, Column col, Object target, boolean
inverse,
            int pos, int cols) {
            boolean elem = vm == vm.getFieldMapping().getElement()
                && vm.getFieldMapping().getTypeCode() != JavaTypes.MAP;

            // if this is a non-inverse collection element key, it must be
in
            // a join table: if we're not prepending the field name, leave
the
            // default
            if (!getPrependFieldNameToJoinTableInverseJoinColumns() &&
!inverse && elem)
                return;

            // otherwise jpa always uses <field>_<pkcol> for column name,
even
            // when only one col
            if (target instanceof Column) {
                if (DBIdentifier.isNull(sName)) {
                    sName = col.getIdentifier();
                } else {
            		String originalName = elem ? vm.getFieldMapping().getName() :
Normalizer.removeHungarianNotation(sName.getName());
            		boolean wasOriginallyDelimited =
Normalizer.isDelimited(originalName);
            		sName = DBIdentifier.newColumn(originalName,
!wasOriginallyDelimited);
                    sName = DBIdentifier.combine(sName,
((Column)target).getIdentifier().getName());

                    // No need to check for uniqueness.
                    sName = dict.getValidColumnName(sName, local, false);
            		sName = addUnderscores(sName, wasOriginallyDelimited);
               }
                col.setIdentifier(sName);
            }
        }

	private DBIdentifier addUnderscores(DBIdentifier sName,
			boolean wasOriginallyDelimited) {
		String nameWithUnderscores = addUnderscores(sName.getName());
		if (!wasOriginallyDelimited) {
			nameWithUnderscores = Normalizer
					.removeDelimiters(nameWithUnderscores);
		}
		sName = DBIdentifier.newColumn(nameWithUnderscores, false);
		return sName;
	}
	
	// taken from Hibernate's ImprovedNamingStrategy
	private static String addUnderscores(String name) {
		StringBuilder buf = new StringBuilder(name.replace('.', '_'));
		for (int i = 1; i < buf.length() - 1; i++) {
			if (Character.isLowerCase(buf.charAt(i - 1))
					&& Character.isUpperCase(buf.charAt(i))
					&& Character.isLowerCase(buf.charAt(i + 1))) {
				buf.insert(i++, '_');
			}
		}
		return buf.toString().toLowerCase();
	}
}


--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580270.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
And replacing the @Table annotation with

@Table(name = "object_classes", uniqueConstraints =
@UniqueConstraint(columnNames = { "name", "\"version\"" }))

fixes the problem. Still don't see why...

--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580265.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Alexey Romanov <al...@gmail.com>.
> Are you saying that without your ImprovedMappingDefaults class, everything 
is working okay?

Yes. Also just checked that if I use ImprovedMappingDefaults class, but
comment out all methods so it doesn't override anything, it works fine.

> Dumb question, 
are you sure your persistence.xml that has the SynchronizeMappings property 
is in use?

Yes, sure :) Just double-checked with using Trace for all logging.

> You could turn on Trace and check to see if the tables are maybe being 
created under a different schema, or some other processing that is 
unexpected or not consistent. 

In fact, tables are _not_ created at all. (I should have mentioned it
before, but I already had SQL=Trace for testing). 

Looking at JUnit panel has shown something interesting. Don't know why it
wasn't present in the console output, but there is a different exception
there:


<openjpa-2.2.0-r422266:1244990 fatal user error>
org.apache.openjpa.persistence.ArgumentException: Errors encountered while
resolving metadata.  See nested exceptions for details.
	at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:668)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
	at
org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355)
	at
org.apache.openjpa.jdbc.meta.MappingTool.getMapping(MappingTool.java:682)
	at
org.apache.openjpa.jdbc.meta.MappingTool.buildSchema(MappingTool.java:754)
	at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:652)
	at
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:154)
	at
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:164)
	at
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:122)
	at
org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209)
	at
org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
	at
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
	at
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
	at
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
	at
ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.setEM(RepositoryTest.java:104)
	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
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
	at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
	at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
	at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
	at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
	at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
	at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
	at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: <openjpa-2.2.0-r422266:1244990 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: The column "version" in a
unique constraint in
"ru.focusmedia.odp.server.datastore.jpa.entity.OdpObjectClassEntity" on
table "object_classes" can not be found in the list of available columns
"[ID, ABSTRACT, "display_name", "internal", NAME, PROVIDER_KIND,
"provider_name", "version", SUPERCLASS]".
	at
org.apache.openjpa.jdbc.meta.ClassMappingInfo.getUniques(ClassMappingInfo.java:520)
	at
org.apache.openjpa.jdbc.meta.ClassMapping.resolveMapping(ClassMapping.java:873)
	at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1802)
	at
org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:822)
	at
org.apache.openjpa.meta.MetaDataRepository.resolveMapping(MetaDataRepository.java:777)
	at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:657)
	... 41 more

What's up with the last exception? Why can't it find a column in the list
which clearly includes it? 

Here's the entity class, in case it helps:

package ru.focusmedia.odp.server.datastore.jpa.entity;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.PostLoad;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;

import ru.focusmedia.odp.server.datastore.api.objects.OdpObjectClassRecord;
import ru.focusmedia.odp.server.datastore.jpa.repository.Transform;
import ru.focusmedia.odp.server.objects.api.Attribute;
import ru.focusmedia.odp.server.objects.api.BooleanAttribute;
import ru.focusmedia.odp.server.objects.api.DateAttribute;
import ru.focusmedia.odp.server.objects.api.DoubleAttribute;
import ru.focusmedia.odp.server.objects.api.LongAttribute;
import ru.focusmedia.odp.server.objects.api.OdpObjectClass;
import ru.focusmedia.odp.server.objects.api.OdpObjectClassProviderData;
import
ru.focusmedia.odp.server.objects.api.OdpObjectClassProviderData.ClassProviderKind;
import ru.focusmedia.odp.server.objects.api.StringAttribute;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;

@SuppressWarnings("serial")
@Entity
@Table(name = "object_classes", uniqueConstraints =
@UniqueConstraint(columnNames = { "name", "version" }))
public class OdpObjectClassEntity implements Serializable,
OdpObjectClassRecord {
	@Id
	@Column(name = "id", nullable = false)
	@GeneratedValue
	private Long id;

	private int version;

	@ManyToOne
	@JoinColumn(name = "superclass")
	private OdpObjectClassEntity superClass;

	@Column(name = "name", nullable = false, length = 128)
	private String name;
	
	private String displayName;

	@OneToMany(mappedBy = "objectClass", cascade = { CascadeType.PERSIST,
			CascadeType.REMOVE }, fetch = FetchType.EAGER)
	@MapKey(name = "name")
	private Map<String, StoredAttributeEntity> storedAttributes;

	@Column(name = "abstract", nullable = false)
	private boolean _abstract;

	@Column(nullable = false)
	private boolean internal;

	@Enumerated(EnumType.STRING)
	@Column(name = "provider_kind", nullable = false)
	private ClassProviderKind providerKind;

	private String providerName;

	@Transient
	private OdpObjectClass objectClass;

	public OdpObjectClassEntity() {
		super();
	}

	// FIXME doesn't support calculable attributes

	public OdpObjectClassEntity(String name, int version,
			OdpObjectClassEntity superClass, boolean _abstract,
			boolean internal, List<Attribute> attributes,
			ClassProviderKind providerKind, String providerName) {
		super();
		this.version = version;
		this.superClass = superClass;
		this.name = name;
		this._abstract = _abstract;
		this.internal = internal;
		this.providerKind = providerKind;
		this.providerName = providerName;
		this.storedAttributes =
Maps.newHashMapWithExpectedSize(attributes.size());
		for (Attribute attr : attributes) {
			StoredAttributeEntity attrEntity;
			if (attr instanceof BooleanAttribute) {
				BooleanAttribute attr1 = (BooleanAttribute) attr;
				attrEntity = new BooleanAttributeEntity(attr1, this);
			} else if (attr instanceof DoubleAttribute) {
				DoubleAttribute attr1 = (DoubleAttribute) attr;
				attrEntity = new DoubleAttributeEntity(attr1, this);
			} else if (attr instanceof DateAttribute) {
				DateAttribute attr1 = (DateAttribute) attr;
				attrEntity = new DateAttributeEntity(attr1, this);
			} else if (attr instanceof LongAttribute) {
				LongAttribute attr1 = (LongAttribute) attr;
				attrEntity = new LongAttributeEntity(attr1, this);
			} else if (attr instanceof StringAttribute) {
				StringAttribute attr1 = (StringAttribute) attr;
				attrEntity = new StringAttributeEntity(attr1, this);
			} else {
				throw new IllegalArgumentException("StoredAttribute "
						+ attr.getName() + " has unknown class: "
						+ attr.getClass().getName());
			}
			this.storedAttributes.put(attrEntity.getName(), attrEntity);
		}
	}

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public Map<String, StoredAttributeEntity> getAttributes() {
		return Collections.unmodifiableMap(storedAttributes);
	}

	@Override
	public OdpObjectClass getObjectClass() {
		if (objectClass == null) {
			OdpObjectClass superObjectClass = superClass != null ? superClass
					.getObjectClass() : null;
			objectClass = new OdpObjectClass(name, version, superObjectClass,
					_abstract, internal, ImmutableList.<Attribute>
copyOf(Transform.attributes(storedAttributes).values()));
		}
		return objectClass;
	}

	@Override
	public String toString() {
		return "OdpObjectClassEntity [id=" + id + ", name=" + name
				+ ", version=" + version + "]";
	}

	@Override
	public OdpObjectClassProviderData getClassProvider() {
		return new OdpObjectClassProviderData(providerKind, providerName);
	}

	public StoredAttributeEntity getAttribute(String attrName) {
		return storedAttributes.get(attrName);
	}
	
	@PostLoad
	public void ensureInitialized() {
		getObjectClass();
	}

	public OdpObjectClassEntity getSuperClass() {
		return superClass;
	}

	public String getDisplayName() {
		return displayName != null ? displayName : name;
	}

	public void setDisplayName(String displayName) {
		this.displayName = displayName;
	}
}

--
View this message in context: http://openjpa.208410.n2.nabble.com/Change-of-MappingDefaults-breaks-OPENJPA-SEQUENCE-TABLE-tp7580246p7580264.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Re: Change of MappingDefaults breaks OPENJPA_SEQUENCE_TABLE

Posted by Kevin Sutter <kw...@gmail.com>.
Hi Alexey,
Are you saying that without your ImprovedMappingDefaults class, everything
is working okay?  On the surface, I'm not seeing the connection between the
column mapping processing and the "missing" sequence table.  Dumb question,
are you sure your persistence.xml that has the SynchronizeMappings property
is in use?  As your Googling found, the use of the SynchronizeMappings
property should ensure that all of the necessary tables are created and/or
modified before use.

You could turn on Trace and check to see if the tables are maybe being
created under a different schema, or some other processing that is
unexpected or not consistent.

Kevin

On Sat, Jun 9, 2012 at 2:11 AM, Alexey Romanov
<al...@gmail.com>wrote:

> I've tried to change mapping defaults to use lowercase underscore column
> names:
>
> package ru.focusmedia.odp.server.datastore.jpa.impl;
>
> import org.apache.openjpa.jdbc.identifier.DBIdentifier;
> import org.apache.openjpa.jdbc.schema.Column;
> import org.apache.openjpa.jdbc.schema.Table;
> import org.apache.openjpa.persistence.jdbc.PersistenceMappingDefaults;
>
> public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
>    @Override
>    protected void correctName(Table table, Column col) {
>        DBIdentifier name =
> DBIdentifier.newColumn(col.getIdentifier().getName(), true);
>        DBIdentifier validName = dict.getValidColumnName(name, table);
>        DBIdentifier correctedName = DBIdentifier
>                .newColumn(addUnderscores(validName.getName()));
>        col.setIdentifier(correctedName);
>        table.addCorrectedColumnName(correctedName, true);
>    }
>
>    // taken from Hibernate's ImprovedNamingStrategy
>    private static String addUnderscores(String name) {
>        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
>        for (int i = 1; i < buf.length() - 1; i++) {
>            if (Character.isLowerCase(buf.charAt(i - 1))
>                    && Character.isUpperCase(buf.charAt(i))
>                    && Character.isLowerCase(buf.charAt(i + 1))) {
>                buf.insert(i++, '_');
>            }
>        }
>        return buf.toString().toLowerCase();
>    }
> }
>
> and added
>
> <property name="openjpa.jdbc.MappingDefaults"
>
>  value="ru.focusmedia.odp.server.datastore.jpa.impl.ImprovedMappingDefaults"/>
>
> to persistence.xml. However, this produces the following error:
>
> org.apache.openjpa.persistence.PersistenceException: Table/View
> 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT SEQUENCE_VALUE FROM
> OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR} [code=20000,
> state=42X05]
>    at
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:66)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:756)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:740)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:612)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2977)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1843)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.isInMemory(QueryImpl.java:973)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:853)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:330)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.java:249)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:327)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.java:312)
> ~[querydsl-jpa-2.6.0.jar:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.getRoleByName(RepositoryImpl.java:523)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.access$4(RepositoryImpl.java:521)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:572)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl$14.call(RepositoryImpl.java:1)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.transact(RepositoryImpl.java:705)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl.createUser(RepositoryImpl.java:568)
> [classes/:na]
>    at
> ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryTest.userCanBeCreated(RepositoryTest.java:158)
> [test-classes/:na]
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> ~[na:1.6.0_31]
>    at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> ~[na:1.6.0_31]
>    at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> ~[na:1.6.0_31]
>    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31]
>    at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
> [junit-4.10.jar:na]
>    at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> [junit-4.10.jar:na]
>    at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
> [junit-4.10.jar:na]
>    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
> [junit-4.10.jar:na]
>    at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> [.cp/:na]
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> [.cp/:na]
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
> Table/View 'OPENJPA_SEQUENCE_TABLE' does not exist. {SELECT
> SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE
> WITH RR} [code=20000, state=42X05]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:227)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:279)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:133)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:122)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:449)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:418)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:807)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:546)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:588)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:893)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:455)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:300)
> ~[openjpa-2.2.0.jar:2.2.0]
>    at
> org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
> ~[openjpa-2.2.0.jar:2.2.0]
>    ... 58 common frames omitted
>
> before any tables are created. Googling says this may happen because
> SynchronizeMappings isn't set, but it is in my case:
>
> <property name="openjpa.jdbc.SynchronizeMappings"
>    value="buildSchema(ForeignKeys=true)" />
> <property name="openjpa.jdbc.DBDictionary"
>    value="derby(NextSequenceQuery=VALUES NEXT VALUE FOR {0})" />
>
> How can I get this to work?
>
> Yours, Alexey Romanov
>