I have to use hibernate along with spring boot. Is it recommended to use JTA transaction manager in this stack?
If JTA is recommended, how to access current session programmatically in controller or service layer ? with example will be more helpful.
As spring documentation says:
Typically, you need an application server’s JTA capability only if your application needs to handle transactions across multiple resources, which is not a requirement for many applications.
And according to spring boot documentation:
Spring Boot supports distributed JTA transactions across multiple XA resources by using either an Atomikos or Bitronix embedded transaction manager. JTA transactions are also supported when deploying to a suitable Java EE Application Server.
When a JTA environment is detected, Spring’s JtaTransactionManager is used to manage transactions. Auto-configured JMS, DataSource, and JPA beans are upgraded to support XA transactions. You can use standard Spring idioms, such as #Transactional, to participate in a distributed transaction.
As for your second question you can have a look at this answer.
Related
I'm using Spring 4.0, EclipseLink 2.6.3 with JPA 2.0 and IBM Websphere 8.5.5.8 with JTA enabled (Oracle 11g).
As of now my app is configured with WebSphereUowTransactionManager as my server/ container is Websphere like below.
<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"></bean>
When I was referring to this link from spring doc's in the 8.9.1. Use of the wrong transaction manager for a specific DataSource section it says
If you are using global transactions, you must use the Spring
org.springframework.transaction.jta.JtaTransactionManager for all your
for all your transactional operations. Otherwise Spring will attempt
to perform local transactions on resources such as container
DataSources.
What does it mean ? Should I shift to org.springframework.transaction.jta.JtaTransactionManager as I'm using Spring #Transactional attributes in my services and DAO's ? Please advice.
UPDATE
As mentioned by #JBNizet its a super class extend by different vendor specific Transaction managers.In that case when should I use org.springframework.orm.jpa.JpaTransactionManager ? How is it different from others ?
Can anybody provide me an example for Spring Transaction management? I have queries like how it basically works? In Java EE , Application server container used to take care of the transaction using EJB's. I wanted to know ,how spring frameworks helps in the same way?
I hope Introduction to Spring Framework transaction management will help.
The Spring Framework’s transaction management support doesn't requires an application server.
Spring Frameworks Claims declarative transactions of spring framework offer more powerful and more productive programming model than EJB CMT.
Compared to transaction management using EJB Spring frameworks enables application developers to use a consistent programming model in any environment. Once we write our code once it can benefit from different transaction management strategies in different environments.
The Spring Framework provides both declarative and programmatic transaction management.
programmatic transaction management - developers work with the Spring Framework transaction abstraction, which can run over any underlying transaction infrastructure.
declarative model - developers typically write little or no code related to transaction management, and hence do not depend on the Spring Framework transaction API, or any other transaction API.
Spring framework provides central interface for transaction
management i.e. 'PlatformTransactionManager'
There are many implementations if it, one which you can quickly
relate to is DataSourceTransactionManager.
Now, this transaction manager does the lower level work of beginning,
rollback and commit of transaction for you.
If you see the source of DataSourceTransactionManager you will see
the same kind of transaction management code that you have seen when
you handle transaction using JDBC api
But importantly, all these things happen declaratively as part of
proxy advise using Spring AOP
Begin Transaction
DataSource ds = /*initialize DS here*/
Connection con = ds.getConnection();
con.setAutoCommit(false);
Commit Transaction
com.commit();
I'm writing a service and I need to use transactions for JDBC & JMS but not distributed.Is it possible use Spring #Transactional annotation on JMS Listener method for a JMS only Transacion using Bitronix or Atomikos since these 2 are also autoconfigured by Spring ?
As far as I know, when I add this dependency, my dataBase transaction also became XA.
What are my options ?
Please see the boot documentation about Mixing XA and non-XA JMS connections.
I have spring 4 application. At the moment I use JpatransactionManager.
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Could you tell me how to choose transaction managers?
For instance, when should I use jta transaction manager and when jpa, and what benefit and disadvantages does they have?
And Is I know I have 2 way to work in Spring. First is JPA way and the second Hibernate way. first one includes java standard annotations and standard api and the second is hibenrate implementation. If i need to use JTA, I must use hibernate and not JPA, does not it?
If you want to delegate managed transactions to your Application Server and handle complex transactions across multiple resources you need to use the JtaTransactionManager, but I believe it is not needed in most cases.
Read this for more information http://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/transaction.html
Do you need an application server for transaction management?
The Spring Framework’s transaction management support changes
traditional rules as to when an enterprise Java application requires
an application server.
In particular, you do not need an application server simply for
declarative transactions through EJBs. In fact, even if your
application server has powerful JTA capabilities, you may decide that
the Spring Framework’s declarative transactions offer more power and a
more productive programming model than EJB CMT.
Typically you need an application server’s JTA capability only if your
application needs to handle transactions across multiple resources,
which is not a requirement for many applications. Many high-end
applications use a single, highly scalable database (such as Oracle
RAC) instead. Standalone transaction managers such as Atomikos
Transactions and JOTM are other options. Of course, you may need other
application server capabilities such as Java Message Service (JMS) and
Java EE Connector Architecture (JCA).
The Spring Framework gives you the choice of when to scale your
application to a fully loaded application server. Gone are the days
when the only alternative to using EJB CMT or JTA was to write code
with local transactions such as those on JDBC connections, and face a
hefty rework if you need that code to run within global,
container-managed transactions. With the Spring Framework, only some
of the bean definitions in your configuration file, rather than your
code, need to change.
I am not running under Java EE.
I want to have an XA transaction using Spring to share a transaction between DB and JMS.
Does spring provide such a functionality or must I use an external transaction manager such as Atomikos?
I use currently the DataSourceTransactionManager for the DB, and I see I can also use the JMSTransactionManager. Do they work together? Not clear from the documentation as JtaTransactionManager is mentioned.
Please advise.
Yair
Spring only provides a framework for transaction management, it as such doesn't provide any transaction manager. If you are running your application outside a Java EE container and you need a transaction between resources like a DB and JMS, you have to use an external TransactionManager like Atomikos or JOTM (Java Open Transaction Manager).
You might want to refer to http://www.javaworld.com/javaworld/jw-04-2007/jw-04-xa.html for more details on XA using Spring.
they are resource local, but Spring does support XA (see this post for explanation and example code) : http://blog.springsource.com/2011/08/15/configuring-spring-and-jta-without-full-java-ee/