2016-05-10 8 views
2

Ich habe folgende Konfiguration in AnwendungskontextDaten werden nicht in JPA Frühling weblogic eingefügt zu werden

<jee:jndi-lookup id="dataSource" jndi-name="MY_DS" /> 
<context:load-time-weaver/> 
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager" /> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean 
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 


<bean id="emf" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jtaDataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
    <property name="persistenceUnitName" value="pu_TEST" /> 
</bean> 
<bean id="jpaVendorAdapter" 
    class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
    <property name="database" value="ORACLE" /> 
    <property name="showSql" value="true" /> 
</bean> 

Nun meine DAO Klasse

@Repository 
public class EmployeeDAO{ 

    @PersistenceContext 
    private EntityManager em; 
    @Transactional 
    public void create(Employee entity) { 
     LOG.error("Enitity Manager:create" + em); 
     em.persist(entity); 
     // em.flush(); if i use flush it saves 
    } 
} 

Nun, wenn ich an das Unternehmen zu speichern macht es keinen Fehler sagen geben aber keine Daten werden in db aktualisiert. Ich möchte nicht bündig als Entitymanager wird von der Feder injiziert und sollte automatisch am Ende bündig durchführen, was nicht passiert. korrigiere mein Verständnis.

Hinzufügen der Fassade Klasse möglicherweise Problem ist, hat Propagation.REQUIRES_NEW hier etwas zu tun?

@Transactional(propagation=Propagation.REQUIRES_NEW) 
public void process(){ 
    Employee e = factory.getEmployee(); 
    employeeDao.create(e); 
} 

Auf Debug erstellen nach Methode aufrufen es Mitarbeiter Primärschlüssel zeigt bekam, dass db Anruf getätigt hat, bedeutet bevölkert, aber am Ende ist es nicht beibehalten.

+0

Welche Federversion verwenden Sie? –

+0

Ich verwende Spring 3.2 – CodeDCode

+0

Der EntityManager ist nicht mit Ihrem Transaktionsmanager verbunden und registriert sich daher nicht als Listener für den Zeitpunkt, an dem die Transaktion festgeschrieben wird. Wie in der Antwort unten erwähnt, wird em.joinTransaction() funktionieren, aber es ist ein Workaround, genau wie der Aufruf von em.flush. Sie vermissen die EntityManagerFactory -Eigenschaft, die an den TransactionManager übergeben wird, wie hier beschrieben http://StackOverflow.com/questions/10421829/how-to-configure-ecipselink-2-0-and-spring-3-0-5-and-tomcat -6 oder versuche, die Zielserver-Eigenschaft zu setzen http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_server.htm – Chris

Antwort

0

Bitte versuchen Sie einen der 3:

1.Solution 1

Bitte rufen Sie unter Code

em.joinTransaction(); 

kurz vor

em.persistEntity(entity); 

2.Solution 2

make Attribut readonly = false in @Transactional

3.Solution 3

manuell Probieren Sie können Bean EmployeeDAO im Frühjahr XML-Datei

oder sonst versuchen unter Zugabe:

@Transactional(propagation=Propagation.REQUIRED) 
+0

2 & 3 funktionieren nicht, wollen keine Umgehung von 1 verwenden – CodeDCode

+0

Das Problem hier ist, dass EntityManager nicht mit der JTA-Transaktion verknüpft werden kann. Eine andere Möglichkeit besteht darin, manuell eine Transaktion wie em.getTransaction() zu starten und dann Transaktionen manuell zu starten und zu übergeben. – shankarsh15

+0

Bitte werfen Sie einen Blick auf diesen Beitrag https://forum.hibernate.org/viewtopic.php?f = 9 & t = 953940 & Ansicht = nächste – shankarsh15

Verwandte Themen