2016-05-10 6 views
2

Я следующие конфигурации в контексте приложенияданные не будут вставлены в JPA Spring WebLogic

<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> 

Теперь мой DAO Класс

@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 
    } 
} 

Теперь, когда я сохранить объект не сказать давать какие-либо ошибки но данные не обновляются в db. Я не хочу использовать флеш, поскольку entitymanager вводится пружиной и должен автоматически выполнять флеш в конце, который не происходит. исправьте мое понимание.

Добавление класса фасада может быть проблемой, есть ли Propagation.REQUIRES_NEW, что-нибудь делать здесь?

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

На Debug после создания вызова метода он показывает сотрудник получил первичный ключ населенный, что означает, дб вызов сделал, но в конце концов она не сохраняется.

+0

Какую версию весны вы используете? –

+0

Я использую Spring 3.2 – CodeDCode

+0

EntityManager не подключен к вашему менеджеру транзакций и поэтому не регистрируется в качестве слушателя, когда совершается транзакция. Как упоминалось в ответе ниже, em.joinTransaction() будет работать, но это обходное решение, так же, как вызов em.flush. Вам не хватает свойства entityManagerFactory, переданного TransactionManager, как описано здесь http://stackoverflow.com/questions/10421829/how-to-configure-eclipselink-2-0-and-spring-3-0-5-and-tomcat -6 или попробуйте установить свойство целевого сервера http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_server.htm – Chris

ответ

0

Пожалуйста, попробуйте любой из 3:

1.Solution 1

Пожалуйста, позвоните ниже код

em.joinTransaction(); 

непосредственно перед

em.persistEntity(entity); 

2.Solution 2

атрибут делают доступен только для чтения = ложь в @Transactional

3.Solution 3

Попробуйте вручную добавлять фасоль EmployeeDAO в весеннем файле XML

или же вы можете попробовать ниже:

@Transactional(propagation=Propagation.REQUIRED) 
+0

2 и 3 не работают, не хотят использовать работу 1 – CodeDCode

+0

. Проблема здесь в том, что EntityManager не может быть связан с транзакцией JTA. Другой способ, хотя и его ручное начало транзакции, например em.getTransaction(), а затем начало и совершение транзакций вручную. – shankarsh15

+0

Пожалуйста, взгляните на это сообщение https://forum.hibernate.org/viewtopic.php?е = 9 & т = 953940 & вид = Следующий – shankarsh15