Я следующие конфигурации в контексте приложенияданные не будут вставлены в 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 после создания вызова метода он показывает сотрудник получил первичный ключ населенный, что означает, дб вызов сделал, но в конце концов она не сохраняется.
Какую версию весны вы используете? –
Я использую Spring 3.2 – CodeDCode
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