@Transactional Frühjahr nicht erzeugen einer neuen Transaktion
Jede Hilfe für diese wird sehr geschätzt werden. Iam mit Spring, Jetty(Eclipse-Jetty-Plugin). Es scheint, wie deklaratives Transaktions-management @Transactional funktioniert nicht.
Bestätigt dies nicht funktioniert auf zwei Arten:
1. Die neu erstellte Entität wird nicht gespült in die Datenbank nach dem Aufruf der Methode.
2. TransactionSynchronizationManager.isActualTransactionActive(); gibt false zurück,
Beachten Sie die unten aufgeführte Methode ist es, neben den für die @Controller-Klasse, wo ein http-request fordert schließlich ruft diese Methode speichern. Die controller-Klasse implementiert nicht alle Schnittstellen.
Eigentliche Code:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(PERule peRule) {
boolean inTransaction = TransactionSynchronizationManager.isActualTransactionActive();
peRuleDAOImpl.persist(peRule);
}
Den Mangel der Transaktion bestätigen, indem Sie die Log-Ausgabe:
DEBUG: org.hibernate.internal.SessionImpl - Opened session at timestamp: 13762325621
DEBUG: org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl - Skipping
JTA sync registration due to auto join checking
DEBUG: org.hibernate.ejb.AbstractEntityManagerImpl - Looking for a JTA transaction to join
DEBUG: org.hibernate.ejb.AbstractEntityManagerImpl - Unable to join JTA transaction
DEBUG: org.hibernate.event.internal.AbstractSaveEventListener - Delaying identity-insert due to no transaction in progress
Allerdings, wenn ich programmgesteuert definieren von expliziten transaktionsgrenzen und commit der Transaktion, der Person ist, wird geleert in der Datenbank. E. g:
@Resource
private PlatformTransactionManager txManager;
private void save(PERule peRule) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = txManager.getTransaction(def);
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
try {
peRuleDAOImpl.persist(peRule);
} catch (Exception ex) {
txManager.rollback(status);
}
txManager.commit(status);
}
Damit dieses nicht zu sein scheinen ein problem mit der Art, wie ich mein transactionManager, da es sein kann, einzuspritzen in das Objekt, wie oben definiert.
ContextConfig: root-context.xml
<aop:aspectj-autoproxy />
<context:annotation-config />
<context:component-scan
base-package="org.springframework.samples.mvc, com.project.*" />
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>/WEB-INF/spring/proddatabase.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/myds" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="EconDatesDB" />
<property name="persistenceXmlLocation" value="/WEB-INF/spring/jpa-prod-persistence.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.format_sql">false
</prop>
<prop key="hibernate.use_sql_comments">false
</prop>
<prop key="hibernate.generate_statistics">false
</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
</prop>
<!-- The following line is what's used in Hibernate 4 instead of a TransactionManagerLookup
class -->
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
</props>
</property>
</bean>
<tx:annotation-driven mode="aspectj" proxy-target-class="true" transaction-manager="transactionManager"/>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- when close is called, should we force transactions to terminate or
not? -->
<property name="forceShutdown" value="false" />
<property name="transactionTimeout" value="300" />
</bean>
<mvc:annotation-driven />
<beans:bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<beans:property name="formatters">
<beans:bean
class="org.springframework.samples.mvc.convert.MaskFormatAnnotationFormatterFactory" />
</beans:property>
</beans:bean>
<!-- Controllers.xml Only contains routes from path to view name, and has no other spring config
<mvc:view-controller path="showcase/" view-name="/WEB-INF/views/home" /> -->
<beans:import resource="/appServlet/controllers.xml" />
servlet-Kontext:
<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/sharedResources/**" location="/parkingEngine/resources/" />
<beans:bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="order" value="1" />
<!-- <beans:property name="prefix" value="/WEB-INF/views/" /> -->
<beans:property name="prefix" value="" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
pom.xml relevante Abhängigkeiten:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.10</version>
</dependency>
Ich habe auch versucht folgenden Varianten tx:annotation-driven in meinem root-context.xml:
<tx:annotation-driven mode="aspectj" proxy-target-class="true" transaction-manager="transactionManager"/>
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
<tx:annotation-driven />
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie bemerkte, deklarative Transaktionsverwaltung ist AOP basiert. Dies bedeutet, dass der Frühling hüllt die Transaktions-Bohnen in ein Transaktions-proxy und kümmert sich um das starten und Transaktionen übernehmen. Dies bedeutet, dass der Aufruf der Methode muss abgefangen werden, indem der proxy um die transaktional sein.
Es sieht aus wie Sie sind ein direkter Aufruf dieser Methode aus einer anderen Methode der selben Bohne. In diesem Fall, es ist ein direkter Aufruf, die nicht über den proxy gehen, das kann so nicht starten Sie die Transaktion:
Der Transaktions-Methode sollte in einem gesonderten Spring-bean (ein service), die durch den controller. Dadurch wird der Aufruf über den proxy gehen:
Dies ist in Einzelheiten erläutert in der Dokumentation.