You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Tony Giaccone <to...@giaccone.org> on 2020/10/28 19:52:11 UTC

Spinning up Cayenne in a unit test.

So I have a project which is running in Bootique, but the data model is
used in several different apps. To facilitate this, we created a jar file
that includes the generated classes, and the code and the
cayenne-project.xml file in one jar file.  The result of this is tests run
for this jar, don't have access to the bootique runtime, as they are part
of a jar that's going to be included in other apps.

We're using an older version of Bootique and so the version of Cayenne is
4.0.B2

The cayenne project, only has a datamap there is no datanode defined in the
xml.

So I'm trying to spin up a cayenne runtime, using this code.

runtime = ServerRuntime.builder()
        .addConfig("cayenne-CohortManager.xml")
        .addModule(binder -> {
            ServerModule.contributeProperties(binder)
                    .put("cayenne.jdbc.driver", "org.h2.Driver")
                    .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
        })
        .build();


The problem is that later, when I try to commit changes, I get this error:

org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
10:05:06] No DataNode configured for DataMap 'datamap' and no default
DataNode set

I'm successfully able to run other tests, because they never do a
commitobjects.


Any suggestions on how to resolve my problem.

Re: Spinning up Cayenne in a unit test.

Posted by Tony Giaccone <to...@giaccone.org>.
Andrus, once again you've quickly pointed me in the right direction, thank
you so much.  I will add that the default behavior of the code you gave me
doesn't automatically create the database schema.

So I had to add the following...

runtime.getDataDomain().getDefaultNode().setSchemaUpdateStrategy(new
CreateIfNoSchemaStrategy());


And with that, all was right with the cayenne stack, it successful
spun up and created the schema and the tests all passed, (well once I
fixed the bugs).

Obviously, I'd prefer to update the code to use a more modern version
of Bootique. Maybe we'll get to that next year.


Tony Giaccone


On Thu, Oct 29, 2020 at 1:08 PM Tony Giaccone <to...@giaccone.org> wrote:

> The thing that's not working in my tests, is the spin up of Cayenne. To solve that problem, I tried two things, one worked, the other didn't.
>
> Let me first explain what I did that worked.
>
> The solution that works, is to copy the model files (cayenne-Cohort.xml, datamap.map.xml) into the resources directory of the test files.
>
> src/test/resources/cayenne-Cohort.xml
>
> src/test/resources/datamap.map.xml
>
> I then changed the name of cayenne-Cohort.xml to cayenne-CohortTest.xml and set a data source on the project to point to h2 in memory. And the then:
>
> schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"
>
> Then I spin up cayenne with:
>
> runtime = ServerRuntime.builder()
>         .addConfig("cayenne-CohortTest.xml")
>         .build();
>
>
> With that configuration I can run my tests successfully.
>
> Obviously, I don't like copying the model file into the test hierarchy as now anytime you change the model, you have to remember to copy it and
>
> change its name. Keeping the two in synch is going to be painful. And I'd rather not do that.
>
>
> So I tried this next.
>
> Leave the models in the directory where they were.
>
> src/main/resources/cayenne-Cohort.xml
>
> src/main/resources/datamap.map.xml
>
> Add a new cayenne project:
>
> src/test/resources/cayenne-testProject.xml
>
> which only has the definition of the datanode and the data source and the Schema Update Strategy set to:
>
> schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"
>
> Then I spin up Cayenne with this code:
>
>
> runtime = ServerRuntime.builder()
>         .addConfig("cayenne-Cohort.xml")
>         .addConfig("cayenne-testProject.xml")
>         .build();
>
> This doesn't work. I get a functional cayenne stack, but the schema never gets generated, so the SQL fails when it tries to execute.
>
> So my question is, am I twisting Cayenne in ways that aren't supposed to work, or is this a bug? Or both....
>
> Ok, three questions. :-)
>
> Tony
>
>
> On Thu, Oct 29, 2020 at 10:50 AM Tony Giaccone <to...@giaccone.org> wrote:
>
>> Andrus, we're using Bootique, but this portion of the code is in it's own
>> jar file, it's just the model and some basic services on the objects.
>> Because it's included in a bootique app, we can't use Bootique to do the
>> testing here. It needs to be just Cayenne. So any ideas about what might be
>> going wrong here?
>>
>>
>> Tony
>>
>> On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <an...@objectstyle.org>
>> wrote:
>>
>>> And while we are at it, I absolutely must plug a mention of Bootique 2.0
>>> / JUnit 5 testing facilities :)
>>>
>>> https://bootique.io/docs/2.x/bootique-docs/#_testing
>>> https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
>>>
>>> They are on a totally different level:
>>>
>>> * Support for Docker/Testcontainers, so you'd test against a real DB,
>>> not Derby or H2
>>> * Liquibase migrations in tests, so you can use a real up-to-date schema
>>> * "Global" scope for test databases and "apps", so you can share them
>>> across test classes, improving performance
>>> * Improved "Table" API for datatsets preparation and data assertions
>>>
>>> Andrus
>>>
>>>
>>> > On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org>
>>> wrote:
>>> >
>>> > You can still start a BQRuntime in tests, even if the module doesn't
>>> use Bootique. Then you'd define a DataSource within BQRuntime, and
>>> "bootique-cayenne" would create a DataNode for it automatically and
>>> transparently. YMMV with older Bootique versions. E.g. Agrest (that has no
>>> Bootique dependency itself) is using Bootique for tests.
>>> >
>>> > Andrus
>>> >
>>> >> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
>>> >>
>>> >> This is what I have now for the spin up:
>>> >>
>>> >> runtime = ServerRuntime.builder()
>>> >>       .addConfig("cayenne-PriceIncrease.xml")
>>> >>       .addModule(binder -> {
>>> >>           ServerModule.contributeProperties(binder)
>>> >>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>>> >>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>> >>       })
>>> >>       .build();
>>> >> DataNode node = new DataNode("testNode");
>>> >> runtime.getDataDomain().setDefaultNode(node);
>>> >>
>>> >>
>>> >> And now on commit changes I get this:
>>> >>
>>> >>
>>> >> Caused by: java.lang.NullPointerException
>>> >> at
>>> >>
>>> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
>>> >> at
>>> >>
>>> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
>>> >> at
>>> >>
>>> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
>>> >> at
>>> >>
>>> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
>>> >> at
>>> >>
>>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
>>> >>
>>> >>
>>> >>
>>> >> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com>
>>> wrote:
>>> >>
>>> >>> You could add a node at runtime:
>>> >>>
>>> >>> DataNode node = *new* DataNode("node");
>>> >>>
>>> >>> ... // configure node
>>> >>>
>>> >>> runtime.getDataDomain().addNode(node);
>>> >>>
>>> >>> runtime.getDataDomain().setDefaultNode(node);
>>> >>>
>>> >>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org>
>>> wrote:
>>> >>>
>>> >>>> So I have a project which is running in Bootique, but the data
>>> model is
>>> >>>> used in several different apps. To facilitate this, we created a
>>> jar file
>>> >>>> that includes the generated classes, and the code and the
>>> >>>> cayenne-project.xml file in one jar file.  The result of this is
>>> tests
>>> >>> run
>>> >>>> for this jar, don't have access to the bootique runtime, as they
>>> are part
>>> >>>> of a jar that's going to be included in other apps.
>>> >>>>
>>> >>>> We're using an older version of Bootique and so the version of
>>> Cayenne is
>>> >>>> 4.0.B2
>>> >>>>
>>> >>>> The cayenne project, only has a datamap there is no datanode
>>> defined in
>>> >>> the
>>> >>>> xml.
>>> >>>>
>>> >>>> So I'm trying to spin up a cayenne runtime, using this code.
>>> >>>>
>>> >>>> runtime = ServerRuntime.builder()
>>> >>>>       .addConfig("cayenne-CohortManager.xml")
>>> >>>>       .addModule(binder -> {
>>> >>>>           ServerModule.contributeProperties(binder)
>>> >>>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>>> >>>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>> >>>>       })
>>> >>>>       .build();
>>> >>>>
>>> >>>>
>>> >>>> The problem is that later, when I try to commit changes, I get this
>>> >>> error:
>>> >>>>
>>> >>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>>> >>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no
>>> default
>>> >>>> DataNode set
>>> >>>>
>>> >>>> I'm successfully able to run other tests, because they never do a
>>> >>>> commitobjects.
>>> >>>>
>>> >>>>
>>> >>>> Any suggestions on how to resolve my problem.
>>> >>>>
>>> >>>
>>> >
>>>
>>>

Re: Spinning up Cayenne in a unit test.

Posted by Tony Giaccone <to...@giaccone.org>.
The thing that's not working in my tests, is the spin up of Cayenne.
To solve that problem, I tried two things, one worked, the other
didn't.

Let me first explain what I did that worked.

The solution that works, is to copy the model files
(cayenne-Cohort.xml, datamap.map.xml) into the resources directory of
the test files.

src/test/resources/cayenne-Cohort.xml

src/test/resources/datamap.map.xml

I then changed the name of cayenne-Cohort.xml to
cayenne-CohortTest.xml and set a data source on the project to point
to h2 in memory. And the then:

schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"

Then I spin up cayenne with:

runtime = ServerRuntime.builder()
        .addConfig("cayenne-CohortTest.xml")
        .build();


With that configuration I can run my tests successfully.

Obviously, I don't like copying the model file into the test hierarchy
as now anytime you change the model, you have to remember to copy it
and

change its name. Keeping the two in synch is going to be painful. And
I'd rather not do that.


So I tried this next.

Leave the models in the directory where they were.

src/main/resources/cayenne-Cohort.xml

src/main/resources/datamap.map.xml

Add a new cayenne project:

src/test/resources/cayenne-testProject.xml

which only has the definition of the datanode and the data source and
the Schema Update Strategy set to:

schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"

Then I spin up Cayenne with this code:


runtime = ServerRuntime.builder()
        .addConfig("cayenne-Cohort.xml")
        .addConfig("cayenne-testProject.xml")
        .build();

This doesn't work. I get a functional cayenne stack, but the schema
never gets generated, so the SQL fails when it tries to execute.

So my question is, am I twisting Cayenne in ways that aren't supposed
to work, or is this a bug? Or both....

Ok, three questions. :-)

Tony


On Thu, Oct 29, 2020 at 10:50 AM Tony Giaccone <to...@giaccone.org> wrote:

> Andrus, we're using Bootique, but this portion of the code is in it's own
> jar file, it's just the model and some basic services on the objects.
> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. It needs to be just Cayenne. So any ideas about what might be
> going wrong here?
>
>
> Tony
>
> On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <an...@objectstyle.org>
> wrote:
>
>> And while we are at it, I absolutely must plug a mention of Bootique 2.0
>> / JUnit 5 testing facilities :)
>>
>> https://bootique.io/docs/2.x/bootique-docs/#_testing
>> https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
>>
>> They are on a totally different level:
>>
>> * Support for Docker/Testcontainers, so you'd test against a real DB, not
>> Derby or H2
>> * Liquibase migrations in tests, so you can use a real up-to-date schema
>> * "Global" scope for test databases and "apps", so you can share them
>> across test classes, improving performance
>> * Improved "Table" API for datatsets preparation and data assertions
>>
>> Andrus
>>
>>
>> > On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org>
>> wrote:
>> >
>> > You can still start a BQRuntime in tests, even if the module doesn't
>> use Bootique. Then you'd define a DataSource within BQRuntime, and
>> "bootique-cayenne" would create a DataNode for it automatically and
>> transparently. YMMV with older Bootique versions. E.g. Agrest (that has no
>> Bootique dependency itself) is using Bootique for tests.
>> >
>> > Andrus
>> >
>> >> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
>> >>
>> >> This is what I have now for the spin up:
>> >>
>> >> runtime = ServerRuntime.builder()
>> >>       .addConfig("cayenne-PriceIncrease.xml")
>> >>       .addModule(binder -> {
>> >>           ServerModule.contributeProperties(binder)
>> >>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>> >>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>> >>       })
>> >>       .build();
>> >> DataNode node = new DataNode("testNode");
>> >> runtime.getDataDomain().setDefaultNode(node);
>> >>
>> >>
>> >> And now on commit changes I get this:
>> >>
>> >>
>> >> Caused by: java.lang.NullPointerException
>> >> at
>> >>
>> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
>> >> at
>> >>
>> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
>> >> at
>> >>
>> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
>> >> at
>> >>
>> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
>> >> at
>> >>
>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
>> >>
>> >>
>> >>
>> >> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:
>> >>
>> >>> You could add a node at runtime:
>> >>>
>> >>> DataNode node = *new* DataNode("node");
>> >>>
>> >>> ... // configure node
>> >>>
>> >>> runtime.getDataDomain().addNode(node);
>> >>>
>> >>> runtime.getDataDomain().setDefaultNode(node);
>> >>>
>> >>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org>
>> wrote:
>> >>>
>> >>>> So I have a project which is running in Bootique, but the data model
>> is
>> >>>> used in several different apps. To facilitate this, we created a jar
>> file
>> >>>> that includes the generated classes, and the code and the
>> >>>> cayenne-project.xml file in one jar file.  The result of this is
>> tests
>> >>> run
>> >>>> for this jar, don't have access to the bootique runtime, as they are
>> part
>> >>>> of a jar that's going to be included in other apps.
>> >>>>
>> >>>> We're using an older version of Bootique and so the version of
>> Cayenne is
>> >>>> 4.0.B2
>> >>>>
>> >>>> The cayenne project, only has a datamap there is no datanode defined
>> in
>> >>> the
>> >>>> xml.
>> >>>>
>> >>>> So I'm trying to spin up a cayenne runtime, using this code.
>> >>>>
>> >>>> runtime = ServerRuntime.builder()
>> >>>>       .addConfig("cayenne-CohortManager.xml")
>> >>>>       .addModule(binder -> {
>> >>>>           ServerModule.contributeProperties(binder)
>> >>>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>> >>>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>> >>>>       })
>> >>>>       .build();
>> >>>>
>> >>>>
>> >>>> The problem is that later, when I try to commit changes, I get this
>> >>> error:
>> >>>>
>> >>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>> >>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
>> >>>> DataNode set
>> >>>>
>> >>>> I'm successfully able to run other tests, because they never do a
>> >>>> commitobjects.
>> >>>>
>> >>>>
>> >>>> Any suggestions on how to resolve my problem.
>> >>>>
>> >>>
>> >
>>
>>

Re: Spinning up Cayenne in a unit test.

Posted by John Huss <jo...@gmail.com>.
Looks like it doesn't have an adaptor, so you should try specifying one
(this is line 103):

        *boolean* supportsGeneratedKeys = node
.getAdapter().supportsGeneratedKeys();


On Thu, Oct 29, 2020 at 9:51 AM Tony Giaccone <to...@giaccone.org> wrote:

> Andrus, we're using Bootique, but this portion of the code is in it's own
> jar file, it's just the model and some basic services on the objects.
> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. It needs to be just Cayenne. So any ideas about what might be
> going wrong here?
>
>
> Tony
>
> On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <an...@objectstyle.org>
> wrote:
>
> > And while we are at it, I absolutely must plug a mention of Bootique 2.0
> /
> > JUnit 5 testing facilities :)
> >
> > https://bootique.io/docs/2.x/bootique-docs/#_testing
> > https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
> >
> > They are on a totally different level:
> >
> > * Support for Docker/Testcontainers, so you'd test against a real DB, not
> > Derby or H2
> > * Liquibase migrations in tests, so you can use a real up-to-date schema
> > * "Global" scope for test databases and "apps", so you can share them
> > across test classes, improving performance
> > * Improved "Table" API for datatsets preparation and data assertions
> >
> > Andrus
> >
> >
> > > On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org>
> > wrote:
> > >
> > > You can still start a BQRuntime in tests, even if the module doesn't
> use
> > Bootique. Then you'd define a DataSource within BQRuntime, and
> > "bootique-cayenne" would create a DataNode for it automatically and
> > transparently. YMMV with older Bootique versions. E.g. Agrest (that has
> no
> > Bootique dependency itself) is using Bootique for tests.
> > >
> > > Andrus
> > >
> > >> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
> > >>
> > >> This is what I have now for the spin up:
> > >>
> > >> runtime = ServerRuntime.builder()
> > >>       .addConfig("cayenne-PriceIncrease.xml")
> > >>       .addModule(binder -> {
> > >>           ServerModule.contributeProperties(binder)
> > >>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
> > >>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
> > >>       })
> > >>       .build();
> > >> DataNode node = new DataNode("testNode");
> > >> runtime.getDataDomain().setDefaultNode(node);
> > >>
> > >>
> > >> And now on commit changes I get this:
> > >>
> > >>
> > >> Caused by: java.lang.NullPointerException
> > >> at
> > >>
> >
> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
> > >> at
> > >>
> >
> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
> > >> at
> > >>
> >
> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
> > >> at
> > >>
> >
> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
> > >> at
> > >>
> >
> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
> > >>
> > >>
> > >>
> > >> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com>
> wrote:
> > >>
> > >>> You could add a node at runtime:
> > >>>
> > >>> DataNode node = *new* DataNode("node");
> > >>>
> > >>> ... // configure node
> > >>>
> > >>> runtime.getDataDomain().addNode(node);
> > >>>
> > >>> runtime.getDataDomain().setDefaultNode(node);
> > >>>
> > >>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org>
> > wrote:
> > >>>
> > >>>> So I have a project which is running in Bootique, but the data model
> > is
> > >>>> used in several different apps. To facilitate this, we created a jar
> > file
> > >>>> that includes the generated classes, and the code and the
> > >>>> cayenne-project.xml file in one jar file.  The result of this is
> tests
> > >>> run
> > >>>> for this jar, don't have access to the bootique runtime, as they are
> > part
> > >>>> of a jar that's going to be included in other apps.
> > >>>>
> > >>>> We're using an older version of Bootique and so the version of
> > Cayenne is
> > >>>> 4.0.B2
> > >>>>
> > >>>> The cayenne project, only has a datamap there is no datanode defined
> > in
> > >>> the
> > >>>> xml.
> > >>>>
> > >>>> So I'm trying to spin up a cayenne runtime, using this code.
> > >>>>
> > >>>> runtime = ServerRuntime.builder()
> > >>>>       .addConfig("cayenne-CohortManager.xml")
> > >>>>       .addModule(binder -> {
> > >>>>           ServerModule.contributeProperties(binder)
> > >>>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
> > >>>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
> > >>>>       })
> > >>>>       .build();
> > >>>>
> > >>>>
> > >>>> The problem is that later, when I try to commit changes, I get this
> > >>> error:
> > >>>>
> > >>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
> > >>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no
> default
> > >>>> DataNode set
> > >>>>
> > >>>> I'm successfully able to run other tests, because they never do a
> > >>>> commitobjects.
> > >>>>
> > >>>>
> > >>>> Any suggestions on how to resolve my problem.
> > >>>>
> > >>>
> > >
> >
> >
>

Re: Spinning up Cayenne in a unit test.

Posted by Andrus Adamchik <an...@objectstyle.org>.
> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. 

You'd be adding Bootique dependencies to the test scope only, so none of it should leak to the modules that include your .jar. But there is a Bootique-free solution as well. See below.

> So any ideas about what might be going wrong here?


>> runtime = ServerRuntime.builder()
>>      .addConfig("cayenne-CohortManager.xml")
>>      .addModule(binder -> {
>>          ServerModule.contributeProperties(binder)
>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>      })
>>      .build();

Overriding connection properties affects a pre-existing DataNode. It won't create a new one. But using explicit ServerRuntimeBuilder API would result in creation of a so-called "synthetic" DataNode behind the scenes. So rewrite the above as follows:

runtime = ServerRuntime.builder()
     .addConfig("cayenne-CohortManager.xml")
     .jdbcDriver("org.h2.Driver")
     .url("jdbc:h2:mem:CohortDB")
     .build();

and this should produce a working stack.

Andrus


> On Oct 29, 2020, at 5:50 PM, Tony Giaccone <to...@giaccone.org> wrote:
> 
> Andrus, we're using Bootique, but this portion of the code is in it's own
> jar file, it's just the model and some basic services on the objects.
> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. It needs to be just Cayenne. So any ideas about what might be
> going wrong here?
> 
> 
> Tony
> 
> On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <an...@objectstyle.org>
> wrote:
> 
>> And while we are at it, I absolutely must plug a mention of Bootique 2.0 /
>> JUnit 5 testing facilities :)
>> 
>> https://bootique.io/docs/2.x/bootique-docs/#_testing
>> https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
>> 
>> They are on a totally different level:
>> 
>> * Support for Docker/Testcontainers, so you'd test against a real DB, not
>> Derby or H2
>> * Liquibase migrations in tests, so you can use a real up-to-date schema
>> * "Global" scope for test databases and "apps", so you can share them
>> across test classes, improving performance
>> * Improved "Table" API for datatsets preparation and data assertions
>> 
>> Andrus
>> 
>> 
>>> On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org>
>> wrote:
>>> 
>>> You can still start a BQRuntime in tests, even if the module doesn't use
>> Bootique. Then you'd define a DataSource within BQRuntime, and
>> "bootique-cayenne" would create a DataNode for it automatically and
>> transparently. YMMV with older Bootique versions. E.g. Agrest (that has no
>> Bootique dependency itself) is using Bootique for tests.
>>> 
>>> Andrus
>>> 
>>>> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
>>>> 
>>>> This is what I have now for the spin up:
>>>> 
>>>> runtime = ServerRuntime.builder()
>>>>      .addConfig("cayenne-PriceIncrease.xml")
>>>>      .addModule(binder -> {
>>>>          ServerModule.contributeProperties(binder)
>>>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>>      })
>>>>      .build();
>>>> DataNode node = new DataNode("testNode");
>>>> runtime.getDataDomain().setDefaultNode(node);
>>>> 
>>>> 
>>>> And now on commit changes I get this:
>>>> 
>>>> 
>>>> Caused by: java.lang.NullPointerException
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
>>>> 
>>>> 
>>>> 
>>>> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:
>>>> 
>>>>> You could add a node at runtime:
>>>>> 
>>>>> DataNode node = *new* DataNode("node");
>>>>> 
>>>>> ... // configure node
>>>>> 
>>>>> runtime.getDataDomain().addNode(node);
>>>>> 
>>>>> runtime.getDataDomain().setDefaultNode(node);
>>>>> 
>>>>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org>
>> wrote:
>>>>> 
>>>>>> So I have a project which is running in Bootique, but the data model
>> is
>>>>>> used in several different apps. To facilitate this, we created a jar
>> file
>>>>>> that includes the generated classes, and the code and the
>>>>>> cayenne-project.xml file in one jar file.  The result of this is tests
>>>>> run
>>>>>> for this jar, don't have access to the bootique runtime, as they are
>> part
>>>>>> of a jar that's going to be included in other apps.
>>>>>> 
>>>>>> We're using an older version of Bootique and so the version of
>> Cayenne is
>>>>>> 4.0.B2
>>>>>> 
>>>>>> The cayenne project, only has a datamap there is no datanode defined
>> in
>>>>> the
>>>>>> xml.
>>>>>> 
>>>>>> So I'm trying to spin up a cayenne runtime, using this code.
>>>>>> 
>>>>>> runtime = ServerRuntime.builder()
>>>>>>      .addConfig("cayenne-CohortManager.xml")
>>>>>>      .addModule(binder -> {
>>>>>>          ServerModule.contributeProperties(binder)
>>>>>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>>>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>>>>      })
>>>>>>      .build();
>>>>>> 
>>>>>> 
>>>>>> The problem is that later, when I try to commit changes, I get this
>>>>> error:
>>>>>> 
>>>>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>>>>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
>>>>>> DataNode set
>>>>>> 
>>>>>> I'm successfully able to run other tests, because they never do a
>>>>>> commitobjects.
>>>>>> 
>>>>>> 
>>>>>> Any suggestions on how to resolve my problem.
>>>>>> 
>>>>> 
>>> 
>> 
>> 


Re: Spinning up Cayenne in a unit test.

Posted by Tony Giaccone <to...@giaccone.org>.
Andrus, we're using Bootique, but this portion of the code is in it's own
jar file, it's just the model and some basic services on the objects.
Because it's included in a bootique app, we can't use Bootique to do the
testing here. It needs to be just Cayenne. So any ideas about what might be
going wrong here?


Tony

On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <an...@objectstyle.org>
wrote:

> And while we are at it, I absolutely must plug a mention of Bootique 2.0 /
> JUnit 5 testing facilities :)
>
> https://bootique.io/docs/2.x/bootique-docs/#_testing
> https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
>
> They are on a totally different level:
>
> * Support for Docker/Testcontainers, so you'd test against a real DB, not
> Derby or H2
> * Liquibase migrations in tests, so you can use a real up-to-date schema
> * "Global" scope for test databases and "apps", so you can share them
> across test classes, improving performance
> * Improved "Table" API for datatsets preparation and data assertions
>
> Andrus
>
>
> > On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org>
> wrote:
> >
> > You can still start a BQRuntime in tests, even if the module doesn't use
> Bootique. Then you'd define a DataSource within BQRuntime, and
> "bootique-cayenne" would create a DataNode for it automatically and
> transparently. YMMV with older Bootique versions. E.g. Agrest (that has no
> Bootique dependency itself) is using Bootique for tests.
> >
> > Andrus
> >
> >> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
> >>
> >> This is what I have now for the spin up:
> >>
> >> runtime = ServerRuntime.builder()
> >>       .addConfig("cayenne-PriceIncrease.xml")
> >>       .addModule(binder -> {
> >>           ServerModule.contributeProperties(binder)
> >>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
> >>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
> >>       })
> >>       .build();
> >> DataNode node = new DataNode("testNode");
> >> runtime.getDataDomain().setDefaultNode(node);
> >>
> >>
> >> And now on commit changes I get this:
> >>
> >>
> >> Caused by: java.lang.NullPointerException
> >> at
> >>
> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
> >> at
> >>
> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
> >> at
> >>
> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
> >> at
> >>
> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
> >> at
> >>
> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
> >>
> >>
> >>
> >> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:
> >>
> >>> You could add a node at runtime:
> >>>
> >>> DataNode node = *new* DataNode("node");
> >>>
> >>> ... // configure node
> >>>
> >>> runtime.getDataDomain().addNode(node);
> >>>
> >>> runtime.getDataDomain().setDefaultNode(node);
> >>>
> >>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org>
> wrote:
> >>>
> >>>> So I have a project which is running in Bootique, but the data model
> is
> >>>> used in several different apps. To facilitate this, we created a jar
> file
> >>>> that includes the generated classes, and the code and the
> >>>> cayenne-project.xml file in one jar file.  The result of this is tests
> >>> run
> >>>> for this jar, don't have access to the bootique runtime, as they are
> part
> >>>> of a jar that's going to be included in other apps.
> >>>>
> >>>> We're using an older version of Bootique and so the version of
> Cayenne is
> >>>> 4.0.B2
> >>>>
> >>>> The cayenne project, only has a datamap there is no datanode defined
> in
> >>> the
> >>>> xml.
> >>>>
> >>>> So I'm trying to spin up a cayenne runtime, using this code.
> >>>>
> >>>> runtime = ServerRuntime.builder()
> >>>>       .addConfig("cayenne-CohortManager.xml")
> >>>>       .addModule(binder -> {
> >>>>           ServerModule.contributeProperties(binder)
> >>>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
> >>>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
> >>>>       })
> >>>>       .build();
> >>>>
> >>>>
> >>>> The problem is that later, when I try to commit changes, I get this
> >>> error:
> >>>>
> >>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
> >>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
> >>>> DataNode set
> >>>>
> >>>> I'm successfully able to run other tests, because they never do a
> >>>> commitobjects.
> >>>>
> >>>>
> >>>> Any suggestions on how to resolve my problem.
> >>>>
> >>>
> >
>
>

Re: Spinning up Cayenne in a unit test.

Posted by Andrus Adamchik <an...@objectstyle.org>.
And while we are at it, I absolutely must plug a mention of Bootique 2.0 / JUnit 5 testing facilities :) 

https://bootique.io/docs/2.x/bootique-docs/#_testing
https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing

They are on a totally different level:

* Support for Docker/Testcontainers, so you'd test against a real DB, not Derby or H2
* Liquibase migrations in tests, so you can use a real up-to-date schema
* "Global" scope for test databases and "apps", so you can share them across test classes, improving performance
* Improved "Table" API for datatsets preparation and data assertions

Andrus


> On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <an...@objectstyle.org> wrote:
> 
> You can still start a BQRuntime in tests, even if the module doesn't use Bootique. Then you'd define a DataSource within BQRuntime, and "bootique-cayenne" would create a DataNode for it automatically and transparently. YMMV with older Bootique versions. E.g. Agrest (that has no Bootique dependency itself) is using Bootique for tests. 
> 
> Andrus
> 
>> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
>> 
>> This is what I have now for the spin up:
>> 
>> runtime = ServerRuntime.builder()
>>       .addConfig("cayenne-PriceIncrease.xml")
>>       .addModule(binder -> {
>>           ServerModule.contributeProperties(binder)
>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>       })
>>       .build();
>> DataNode node = new DataNode("testNode");
>> runtime.getDataDomain().setDefaultNode(node);
>> 
>> 
>> And now on commit changes I get this:
>> 
>> 
>> Caused by: java.lang.NullPointerException
>> at
>> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
>> at
>> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
>> at
>> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
>> at
>> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
>> at
>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
>> 
>> 
>> 
>> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:
>> 
>>> You could add a node at runtime:
>>> 
>>> DataNode node = *new* DataNode("node");
>>> 
>>> ... // configure node
>>> 
>>> runtime.getDataDomain().addNode(node);
>>> 
>>> runtime.getDataDomain().setDefaultNode(node);
>>> 
>>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org> wrote:
>>> 
>>>> So I have a project which is running in Bootique, but the data model is
>>>> used in several different apps. To facilitate this, we created a jar file
>>>> that includes the generated classes, and the code and the
>>>> cayenne-project.xml file in one jar file.  The result of this is tests
>>> run
>>>> for this jar, don't have access to the bootique runtime, as they are part
>>>> of a jar that's going to be included in other apps.
>>>> 
>>>> We're using an older version of Bootique and so the version of Cayenne is
>>>> 4.0.B2
>>>> 
>>>> The cayenne project, only has a datamap there is no datanode defined in
>>> the
>>>> xml.
>>>> 
>>>> So I'm trying to spin up a cayenne runtime, using this code.
>>>> 
>>>> runtime = ServerRuntime.builder()
>>>>       .addConfig("cayenne-CohortManager.xml")
>>>>       .addModule(binder -> {
>>>>           ServerModule.contributeProperties(binder)
>>>>                   .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>>                   .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>>       })
>>>>       .build();
>>>> 
>>>> 
>>>> The problem is that later, when I try to commit changes, I get this
>>> error:
>>>> 
>>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
>>>> DataNode set
>>>> 
>>>> I'm successfully able to run other tests, because they never do a
>>>> commitobjects.
>>>> 
>>>> 
>>>> Any suggestions on how to resolve my problem.
>>>> 
>>> 
> 


Re: Spinning up Cayenne in a unit test.

Posted by Andrus Adamchik <an...@objectstyle.org>.
You can still start a BQRuntime in tests, even if the module doesn't use Bootique. Then you'd define a DataSource within BQRuntime, and "bootique-cayenne" would create a DataNode for it automatically and transparently. YMMV with older Bootique versions. E.g. Agrest (that has no Bootique dependency itself) is using Bootique for tests. 

Andrus

> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <to...@giaccone.org> wrote:
> 
> This is what I have now for the spin up:
> 
> runtime = ServerRuntime.builder()
>        .addConfig("cayenne-PriceIncrease.xml")
>        .addModule(binder -> {
>            ServerModule.contributeProperties(binder)
>                    .put("cayenne.jdbc.driver", "org.h2.Driver")
>                    .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>        })
>        .build();
> DataNode node = new DataNode("testNode");
> runtime.getDataDomain().setDefaultNode(node);
> 
> 
> And now on commit changes I get this:
> 
> 
> Caused by: java.lang.NullPointerException
> at
> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
> at
> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
> at
> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
> at
> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
> at
> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
> 
> 
> 
> On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:
> 
>> You could add a node at runtime:
>> 
>> DataNode node = *new* DataNode("node");
>> 
>> ... // configure node
>> 
>> runtime.getDataDomain().addNode(node);
>> 
>> runtime.getDataDomain().setDefaultNode(node);
>> 
>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org> wrote:
>> 
>>> So I have a project which is running in Bootique, but the data model is
>>> used in several different apps. To facilitate this, we created a jar file
>>> that includes the generated classes, and the code and the
>>> cayenne-project.xml file in one jar file.  The result of this is tests
>> run
>>> for this jar, don't have access to the bootique runtime, as they are part
>>> of a jar that's going to be included in other apps.
>>> 
>>> We're using an older version of Bootique and so the version of Cayenne is
>>> 4.0.B2
>>> 
>>> The cayenne project, only has a datamap there is no datanode defined in
>> the
>>> xml.
>>> 
>>> So I'm trying to spin up a cayenne runtime, using this code.
>>> 
>>> runtime = ServerRuntime.builder()
>>>        .addConfig("cayenne-CohortManager.xml")
>>>        .addModule(binder -> {
>>>            ServerModule.contributeProperties(binder)
>>>                    .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>                    .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>        })
>>>        .build();
>>> 
>>> 
>>> The problem is that later, when I try to commit changes, I get this
>> error:
>>> 
>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
>>> DataNode set
>>> 
>>> I'm successfully able to run other tests, because they never do a
>>> commitobjects.
>>> 
>>> 
>>> Any suggestions on how to resolve my problem.
>>> 
>> 


Re: Spinning up Cayenne in a unit test.

Posted by Tony Giaccone <to...@giaccone.org>.
This is what I have now for the spin up:

runtime = ServerRuntime.builder()
        .addConfig("cayenne-PriceIncrease.xml")
        .addModule(binder -> {
            ServerModule.contributeProperties(binder)
                    .put("cayenne.jdbc.driver", "org.h2.Driver")
                    .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
        })
        .build();
DataNode node = new DataNode("testNode");
runtime.getDataDomain().setDefaultNode(node);


And now on commit changes I get this:


Caused by: java.lang.NullPointerException
at
org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
at
org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
at
org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
at
org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
at
org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)



On Wed, Oct 28, 2020 at 4:08 PM John Huss <jo...@gmail.com> wrote:

> You could add a node at runtime:
>
> DataNode node = *new* DataNode("node");
>
> ... // configure node
>
> runtime.getDataDomain().addNode(node);
>
> runtime.getDataDomain().setDefaultNode(node);
>
> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org> wrote:
>
> > So I have a project which is running in Bootique, but the data model is
> > used in several different apps. To facilitate this, we created a jar file
> > that includes the generated classes, and the code and the
> > cayenne-project.xml file in one jar file.  The result of this is tests
> run
> > for this jar, don't have access to the bootique runtime, as they are part
> > of a jar that's going to be included in other apps.
> >
> > We're using an older version of Bootique and so the version of Cayenne is
> > 4.0.B2
> >
> > The cayenne project, only has a datamap there is no datanode defined in
> the
> > xml.
> >
> > So I'm trying to spin up a cayenne runtime, using this code.
> >
> > runtime = ServerRuntime.builder()
> >         .addConfig("cayenne-CohortManager.xml")
> >         .addModule(binder -> {
> >             ServerModule.contributeProperties(binder)
> >                     .put("cayenne.jdbc.driver", "org.h2.Driver")
> >                     .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
> >         })
> >         .build();
> >
> >
> > The problem is that later, when I try to commit changes, I get this
> error:
> >
> > org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
> > 10:05:06] No DataNode configured for DataMap 'datamap' and no default
> > DataNode set
> >
> > I'm successfully able to run other tests, because they never do a
> > commitobjects.
> >
> >
> > Any suggestions on how to resolve my problem.
> >
>

Re: Spinning up Cayenne in a unit test.

Posted by John Huss <jo...@gmail.com>.
You could add a node at runtime:

DataNode node = *new* DataNode("node");

... // configure node

runtime.getDataDomain().addNode(node);

runtime.getDataDomain().setDefaultNode(node);

On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <to...@giaccone.org> wrote:

> So I have a project which is running in Bootique, but the data model is
> used in several different apps. To facilitate this, we created a jar file
> that includes the generated classes, and the code and the
> cayenne-project.xml file in one jar file.  The result of this is tests run
> for this jar, don't have access to the bootique runtime, as they are part
> of a jar that's going to be included in other apps.
>
> We're using an older version of Bootique and so the version of Cayenne is
> 4.0.B2
>
> The cayenne project, only has a datamap there is no datanode defined in the
> xml.
>
> So I'm trying to spin up a cayenne runtime, using this code.
>
> runtime = ServerRuntime.builder()
>         .addConfig("cayenne-CohortManager.xml")
>         .addModule(binder -> {
>             ServerModule.contributeProperties(binder)
>                     .put("cayenne.jdbc.driver", "org.h2.Driver")
>                     .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>         })
>         .build();
>
>
> The problem is that later, when I try to commit changes, I get this error:
>
> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
> DataNode set
>
> I'm successfully able to run other tests, because they never do a
> commitobjects.
>
>
> Any suggestions on how to resolve my problem.
>