Hi Pablo,

What about removing the flush/flushmode? I'm not a JPA expert, but calling
flush will definitely put the data in the db, and flushmode='auto' will
call it at every find:
https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

Regards,

2016-08-24 17:15 GMT+02:00 Pablo Gómez Pérez <[email protected]>:

> Hi all,
>
>          I need again from your help, I'm facing the following issue,
>
> Having a method annotated as transactional that samples data to the
> database and assuming that we start with an Empty database
>
>     @Transactional(value = TxType.REQUIRED, rollbackOn = { Exception.class
> })
>     public void sample() {
>
>
>                dao.persist(....)
>
>
>               dao.merge(....)
>
>                //here a find so that we make the provider to do a flush to
> the DB as the flushmode is configured as AUTO
>
>                dao.find(.....)
>
>                 //Now if I open the MySQLWorkbench I can see the
> persisted/updated data even though the transaction it is not yet commited
>
>                 //Do more operations
>
>                 persist(....)
>
>                //We throw an exception to force a rollback
>
>                throw new RuntimeException("I want a rollback! :)")
>
>     }
>
>
> Where DAO methods are of course annotated with @Transactional alike the
> Sampler with REQUIRED and rollbackOn Exception.class. And Of course the
> <tx:enable/>  it is configured too in the DAO blueprint.
>
> As you can assume in the DAO there is the em injected as specified in the
> docu:
>
>
>     @PersistenceContext(unitName = "managed-jpa")
>     private EntityManager entityManager;
>
>
> Using MySQL InnoDB as follows
>
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint default-activation="eager"
>     xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance";
>     xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0"; xmlns:tx="
> http://aries.apache.org/xmlns/transactions/v2.0.0";>
>
>     <bean id="dataSource" class="com.mysql.jdbc.jdbc2.op
> tional.MysqlDataSource">
>         <property name="URL" value="jdbc:mysql://localhost:
> 3306/dbschema"/>
>         <property name="user" value="root" />
>         <property name="password" value="" />
>     </bean>
>
>     <service interface="javax.sql.DataSource" ref="dataSource">
>         <service-properties>
>             <entry key="osgi.jndi.service.name" value="jdbc/myds" />
>         </service-properties>
>     </service>
>
> </blueprint>
>
> And.. persistence unit
>
>
> <persistence version="2.0"
>     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";>
>     <persistence-unit name="managed-jpa" transaction-type="JTA">
> <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name
> =jdbc/myds)</jta-data-source>
>         <properties>
>             <property name="hibernate.connection.driver_class"
> value="com.mysql.jdbc.Driver" />
>             <property name="hibernate.dialect"
> value="org.hibernate.dialect.MySQL5InnoDBDialect" />
>             <property name="hibernate.hbm2ddl.auto" value="create-drop" />
>             <property name="hibernate.archive.autodetection"
> value="class" />
>             <property name="hibernate.show_sql" value="true" />
>             <property name="hibernate.format_sql" value="false" />
>             <property name="org.hibernate.flushMode" value="AUTO"/>
>         </properties>
>     </persistence-unit>
> </persistence>
>
>
> Considering that I do have transactional annotations activated:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:tx="
> http://aries.apache.org/xmlns/transactions/v2.0.0";
>     xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0";
>     xsi:schemaLocation="
>              http://www.osgi.org/xmlns/blueprint/v1.0.0
> http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
>              http://aries.apache.org/xmlns/transactions/v2.0.0
> http://aries.apache.org/schemas/transaction/transactionv20.xsd";>
>     <jpa:enable />
>     <tx:enable/>
>
>
> Additionally, lets assume that we have a Synchronization registered to the
> transaction so that afterCompletion and BeforeeCompletion are  called.
>
> So now my problem:
>
>                     The transaction in before and after completion has
> status 4 -rollback- as expected because of the exception I'm throwing in
> the sampler, however there is no real rollback as I can still see the data
> in the database -eg. using again the MySQL Workbench- perhaps during the
> transaction the DB transaction was commited when the flush was performed
> due to the call to 'find' in the sampler. Actually for me it looks that
> somehow there is an autocommit when flush...
>
>
> I was expecting that the fact of calling find during the transaction
> -fires a flush- which does happen so that the find returns data considering
> what already did happen during the transaction. However, I wasn't expecting
> to see this data already in the MySQLWorkbench as that is a different
> transaction. But more importantly I was expecting the database to be empty
> at the end of the transaction due to the provoked rollback
>
>
> These are the jpa jta bundles I have
>
> START LEVEL 6
>    ID|State      |Level|Name
>    25|Active     |    2|Apache Aries JPA blueprint (2.4.0)|2.4.0
>    38|Active     |    2|Apache Aries JPA Container API (2.4.0)|2.4.0
>    40|Active     |    2|Apache Aries JPA container (2.4.0)|2.4.0
>    50|Active     |    2|Apache Aries JPA support (2.4.0)|2.4.0
> g! lb transaction
> START LEVEL 6
>    ID|State      |Level|Name
>    23|Active     |    2|Apache Aries Transaction Blueprint (1.1.1)|1.1.1
>    68|Active     |    4|javax.transaction API (1.2.0)|1.2.0
>   104|Active     |    2|Apache Aries Transaction Manager (1.3.0)|1.3.0
>   138|Active     |    2|Apache Aries Transaction Blueprint (2.1.0)|2.1.0
>
>
> I have running blueprint 1.1.1 and 2.1.0 but as noted in the blueprint
> above, I'm using namespace 2.0 so the jpa blueprint 1.1.1 is not really
> needed but anyway I have it running for testing purposes
>
>
> Any hint about what I'm doing wrong?
>
> Thank you!
>
> regards
>
> Pablo
>
>
>
>
>
>
> --
> WARNING: Computer viruses can be transmitted via email. The recipient
> should check this email and any attachments for the presence of viruses.
> The company accepts no liability for any damage caused by any virus
> transmitted by this email. E-mail transmission cannot be guaranteed to be
> secure or error-free as information could be intercepted, corrupted, lost,
> destroyed, arrive late or incomplete, or contain viruses. The sender
> therefore does not accept liability for any errors or omissions in the
> contents of this message, which arise as a result of e-mail transmission.
>
> Warning: Although the company has taken reasonable precautions to ensure
> no viruses are present in this email, the company cannot accept
> responsibility for any loss or damage arising from the use of this email or
> attachments.
>



-- 
Charlie Mordant

Full OSGI/EE stack made with Karaf:
https://github.com/OsgiliathEnterprise/net.osgiliath.parent

Reply via email to