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