tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1604
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Denis Denis ist offline Grünschnabel
    Registriert seit
    Apr 2010
    Beiträge
    1
    Hallo,

    ich experimentiere in den letzten Wochen mit EJB (3.1), Spring (2.5) und Glassfish (3.1) und bin auf ein Problem mit der Transaktionsverwaltung gestoßen.
    Vielleicht fällt Euch der Fehler auf. Ich finde Ihn definitiv nicht.


    Service :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public void saveNamespace() {
    TransactionTemplate transactionTemplate = (TransactionTemplate) appContext.getBean("txTemplate");
      try {
        transactionTemplate.execute(new TransactionCallback() {
          public Object doInTransaction(TransactionStatus status) {
            ApplicationDao dao = factory.createApplicationDao();
     
            try {
              Namespace namespace = factory.createNamespace("test1");
              namespace.setDescription("test1");
              dao.saveNamespace(namespace); 
                            
            } catch (Throwable ex) {
              status.setRollbackOnly();
            }
        }
      });
    }

    Dao :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    @Repository
    public class ApplicationDaoImpl /*extends JpaDaoSupport*/ implements ApplicationDao {
      @PersistenceContext  //Injiziert EntityManager
      private EntityManager entityManager;
     
      public void saveNamespace(Namespace namespace) {
        getEntityManager().merge((NamespaceImpl) namespace);
      }
        
      ...
    }


    Model :
    Namespace --> NamespaceImpl


    Spring - config :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:flow="http://www.springframework.org/schema/webflow-config"
           xmlns:jms="http://www.springframework.org/schema/jms"
           xmlns:jee="http://www.springframework.org/schema/jee"
           xmlns:lang="http://www.springframework.org/schema/lang"
           xmlns:osgi="http://www.springframework.org/schema/osgi"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:util="http://www.springframework.org/schema/util"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd
           http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
           http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
           http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
     
        <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
     
        <bean
            class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" >
            <property name="defaultPersistenceUnitName" value="test_db"/>
        </bean>
     
        <jee:jndi-lookup id="dataSource" jndi-name="test_db"/>
     
        <bean id="entityManagerFactory"
              class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="POSTGRESQL" />
                    <property name="generateDdl" value="false" />
                    <property name="showSql" value="true" />
                </bean>
            </property>
            <property name="persistenceUnitName" value="test_db" />
        </bean>
     
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>
     
        <bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate">
            <property name="transactionManager" ref="transactionManager"/>
        </bean>
     
     ...
    </beans>


    persistence.xml :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    <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_1_0.xsd"
                 version="1.0">
     
        <persistence-unit name="test_db">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
     
            <class>test.NamespaceImpl</class>
     
            <properties>
                <property name="hibernate.archive.autodetection" value=""/>
     
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.format_sql" value="true"/>
                <property name="use_sql_comments" value="true"/>
     
                <property name="hibernate.connection.useUnicode" value="true" />
                <property name="hibernate.connection.charSet" value="UTF-8" />
                <property name="hibernate.connection.characterEncoding" value="UTF-8" />
                <property name="hibernate.max_fetch_depth" value="3"/>
     
                <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
                <property name="hibernate.cache.use_query_cache" value="true" />
                <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
                <property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache-master.xml" />
            </properties>
        </persistence-unit>
    </persistence>


    Glassfish - domain.xml :
    In Glassfish habe ich einen jdbc connection pool eingerichtet.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    <resources>
    <jdbc-connection-pool driver-classname="org.postgresql.Driver" res-type="java.sql.Driver" name="test_db" transaction-isolation-level="read-committed">
      <property name="URL" value="jdbc:postgresql://localhost/test_db" />
      <property name="password" value="admin" />
      <property name="user" value="admin" />
    </jdbc-connection-pool>
    <jdbc-resource pool-name="test_db" jndi-name="test_db" />
    </resources>


    Fehlermeldung :
    Das Lesen von Daten aus der Datenbank funktioniert (anscheinend nicht in der von mir veranlassten Transaktion)
    Ein schreibender Zugriff führt zu dieser Exception :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    [#|2010-04-15T21:43:55.618+0200|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=30;_ThreadName=Thread-1;|javax.persistence.TransactionRequiredException: no transaction is in progress
        at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:294)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:346)
        at $Proxy200.flush(Unknown Source)


    Wisst Ihr, wo der Fehler verborgen ist ?
    Ich gehe stark davon aus, dass die spring config und/oder die persistence.xml fehlerhaft ist.
    Mir ist auch noch nicht klar, wer auf den injizierten EntityManager ein close aufruft, und die Resourcen freigibt ? Wird dies automatisch freigegeben, sobald die Dao Klasse nicht
    mehr referenziert wird ?

    Ihr würdet mir sehr helfen, wenn Ihr mir bei dem Problem helfen könntet.

    Grüße
    Denis
    Geändert von Denis (16.04.10 um 22:06 Uhr)
     

  2. #2
    lumpiscore lumpiscore ist offline Grünschnabel
    Registriert seit
    Mar 2010
    Beiträge
    3
    Hi Denis,

    genau kann ich es Dir auf die Schnelle nicht beantworten. Was ich jedoch an Deiner Stelle versuchen würde ist folgendes:

    Du hast bereits in deinem ApplicationContext.xml die Bean PersistenceAnnotationBeanPostProcessor erzeugt sowie einen tx-Manager. Versuch doch mal deine Configuration durch folgendes zu erweitern:

    Definiere das die Transaction Annotation-Driven ist:

    Code :
    1
    
    <tx:annotation-driven />

    Evtl. musst du nebst der aktivierung der Annotation-Driven Transaction noch den spezifischen Transactionsmanager (JPA oder welchen Du auch nutzt) deklarieren:

    Code :
    1
    
    transaction-manager="transactionManager"

    Danach musst Du noch das entsprechende DAO oder Service mit der Annotation @Transactional kennzeichnen. Somit solltest Du neu eine Transaction haben - zumindest aus sicht JPA und Spring.

    Evtl. hilft Dir diese info einwenig weiter.

    cheers

    lumpiscore
     

  3. #3
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Mal eine blöde Frage...Warum machst Du die Transaktionsmangerklamotte händisch?

    Eine Transaktionsklammer erreichst Du doch bei Java EE durch @Transaction.RequiresNew. Warum lässt Du Deinen Container nicht die Transaktionen verwalten?

    [EDIT] ich schalte autocommit bei Postgresql explizit auf false. Das könnte schon die Lösung Deines Rätsels sein.

    Ausserdem verwende ich in EJB3.x Anwendungen kein Spring (wozu auch?). Da Du hier mit Spring-Transaktionsmanagement agierst, weiss ich nicht, wie gut oder schlecht sich das mit dem Container verträgt.

    [/EDIT]

    Grüße
    gore
    Geändert von gorefest (03.05.10 um 07:44 Uhr)
     

Ähnliche Themen

  1. Spring Transaction
    Von chrissi78 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 25.09.09, 19:27
  2. The import javax.persistence cannot be resolved
    Von Alexander1307 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 16.11.08, 01:32
  3. JBoss, Hibernate und EJB 3.0 - javax.persistence.PersistenceException
    Von Herr_M im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 07.10.08, 12:18
  4. EJB 3.0 und Geronimo. -import javax.persistence.*
    Von Hubivan im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 06.05.08, 16:40
  5. Distributed Transaction Coordinator
    Von MD1978 im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 03.06.05, 14:15