You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@aries.apache.org by Jens Offenbach <wo...@gmx.de> on 2017/04/18 06:59:09 UTC
Updating entities with Aries JPA in Declarative Services
Hallo,
I have got a question regarding updates of JPA entities using Aries JPA with Declarative Services (DS). Hopefully, someone can help me.
Let's assume we have the Task entity from the example here: https://github.com/apache/aries/blob/trunk/jpa/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
When e.g. the fields "title" and "description" must be updated, is it mandatory to do it via JpaTemplate within a transaction like this:
jpa.tx(em -> {
task.setDescription("New description");
task.setTitle("New title");
em.flush();
});
or can safely be done without any transaction like this:
task.setDescription("New description");
task.setTitle("New title");
I would say, it can be done directly without any transactions on application-level because transaction-type is "JTA" and not "RESOURCE_LOCAL".
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="treedb" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!-- Only used when transaction-type=JTA -->
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</jta-data-source>
<!-- Only used when transaction-type=RESOURCE_LOCAL -->
<non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</non-jta-data-source>
<class>...</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
<property name="eclipselink.weaving" value = "static"/>
<property name="eclipselink.weaving.internal" value="true"/>
<property name="eclipselink.weaving.lazy" value="true" />
<property name="eclipselink.weaving.changetracking" value="true" />
<property name="eclipselink.weaving.fetchgroups" value="true" />
<property name="eclipselink.weaving.eager" value="false" />
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
<property name="eclipselink.logging.level" value="FINEST" />
</properties>
</persistence-unit>
</persistence>
Thank you very much.
Regards,
Jens
Aw: Re: Updating entities with Aries JPA in Declarative Services
Posted by Jens Offenbach <wo...@gmx.de>.
@Christian
That was the missing piece... Thank you very much!
Best regards,
Jens
Gesendet: Dienstag, 18. April 2017 um 10:10 Uhr
Von: "Christian Schneider" <ch...@die-schneider.net>
An: user@aries.apache.org
Betreff: Re: Updating entities with Aries JPA in Declarative Services
Transaction type JTA means that you need a JTA transaction instead of a
local transaction on the em.
In both cases it is necessary to be in a transaction when you do changes
to the database.
The JPATemplate allows to transparently begin and commit the
transaction. It also demarcates the lifecycle of the em. So outside the
outermost JPATemplate execution the em is closed and your entities are
detached.
Your code without a transaction might work but rather as a side effect
of persistence manager caching. For example hibernate does not directly
write to the database when you change properties.
So simply changing the properties might work outside the transaction.
Still I would not recommend it as you never know when hibernate decides
to write to the db.
Christian
On 18.04.2017 08:59, Jens Offenbach wrote:
> Hallo,
> I have got a question regarding updates of JPA entities using Aries JPA with Declarative Services (DS). Hopefully, someone can help me.
>
> Let's assume we have the Task entity from the example here: https://github.com/apache/aries/blob/trunk/jpa/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
>
> When e.g. the fields "title" and "description" must be updated, is it mandatory to do it via JpaTemplate within a transaction like this:
>
> jpa.tx(em -> {
> task.setDescription("New description");
> task.setTitle("New title");
> em.flush();
> });
>
> or can safely be done without any transaction like this:
>
> task.setDescription("New description");
> task.setTitle("New title");
>
> I would say, it can be done directly without any transactions on application-level because transaction-type is "JTA" and not "RESOURCE_LOCAL".
>
> persistence.xml:
> <?xml version="1.0" encoding="UTF-8"?>
> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="
> http://java.sun.com/xml/ns/persistence[http://java.sun.com/xml/ns/persistence]
> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd[http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd]"
> version="2.0">
> <persistence-unit name="treedb" transaction-type="JTA">
>
> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
> <!-- Only used when transaction-type=JTA -->
> <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</jta-data-source>
> <!-- Only used when transaction-type=RESOURCE_LOCAL -->
> <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</non-jta-data-source>
>
> <class>...</class>
> <exclude-unlisted-classes>true</exclude-unlisted-classes>
>
> <properties>
> <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
>
> <property name="eclipselink.weaving" value = "static"/>
> <property name="eclipselink.weaving.internal" value="true"/>
> <property name="eclipselink.weaving.lazy" value="true" />
> <property name="eclipselink.weaving.changetracking" value="true" />
> <property name="eclipselink.weaving.fetchgroups" value="true" />
> <property name="eclipselink.weaving.eager" value="false" />
>
> <property name="eclipselink.ddl-generation" value="create-tables" />
> <property name="eclipselink.ddl-generation.output-mode" value="database" />
> <property name="eclipselink.logging.level" value="FINEST" />
> </properties>
> </persistence-unit>
> </persistence>
>
> Thank you very much.
>
> Regards,
> Jens
--
Christian Schneider
http://www.liquid-reality.de[http://www.liquid-reality.de]
Open Source Architect
http://www.talend.com[http://www.talend.com]
Re: Updating entities with Aries JPA in Declarative Services
Posted by Christian Schneider <ch...@die-schneider.net>.
Transaction type JTA means that you need a JTA transaction instead of a
local transaction on the em.
In both cases it is necessary to be in a transaction when you do changes
to the database.
The JPATemplate allows to transparently begin and commit the
transaction. It also demarcates the lifecycle of the em. So outside the
outermost JPATemplate execution the em is closed and your entities are
detached.
Your code without a transaction might work but rather as a side effect
of persistence manager caching. For example hibernate does not directly
write to the database when you change properties.
So simply changing the properties might work outside the transaction.
Still I would not recommend it as you never know when hibernate decides
to write to the db.
Christian
On 18.04.2017 08:59, Jens Offenbach wrote:
> Hallo,
> I have got a question regarding updates of JPA entities using Aries JPA with Declarative Services (DS). Hopefully, someone can help me.
>
> Let's assume we have the Task entity from the example here: https://github.com/apache/aries/blob/trunk/jpa/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
>
> When e.g. the fields "title" and "description" must be updated, is it mandatory to do it via JpaTemplate within a transaction like this:
>
> jpa.tx(em -> {
> task.setDescription("New description");
> task.setTitle("New title");
> em.flush();
> });
>
> or can safely be done without any transaction like this:
>
> task.setDescription("New description");
> task.setTitle("New title");
>
> I would say, it can be done directly without any transactions on application-level because transaction-type is "JTA" and not "RESOURCE_LOCAL".
>
> persistence.xml:
> <?xml version="1.0" encoding="UTF-8"?>
> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="
> http://java.sun.com/xml/ns/persistence
> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
> version="2.0">
> <persistence-unit name="treedb" transaction-type="JTA">
>
> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
> <!-- Only used when transaction-type=JTA -->
> <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</jta-data-source>
> <!-- Only used when transaction-type=RESOURCE_LOCAL -->
> <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/treedb)</non-jta-data-source>
>
> <class>...</class>
> <exclude-unlisted-classes>true</exclude-unlisted-classes>
>
> <properties>
> <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
>
> <property name="eclipselink.weaving" value = "static"/>
> <property name="eclipselink.weaving.internal" value="true"/>
> <property name="eclipselink.weaving.lazy" value="true" />
> <property name="eclipselink.weaving.changetracking" value="true" />
> <property name="eclipselink.weaving.fetchgroups" value="true" />
> <property name="eclipselink.weaving.eager" value="false" />
>
> <property name="eclipselink.ddl-generation" value="create-tables" />
> <property name="eclipselink.ddl-generation.output-mode" value="database" />
> <property name="eclipselink.logging.level" value="FINEST" />
> </properties>
> </persistence-unit>
> </persistence>
>
> Thank you very much.
>
> Regards,
> Jens
--
Christian Schneider
http://www.liquid-reality.de
Open Source Architect
http://www.talend.com