Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > проблемы с Transaction


Автор: hamsterKSU 7.6.2007, 19:43
в JpaTemplate не хочет работать persist
вот applicationContext.xml
Код

<bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    
    <jee:jndi-lookup id="entityManagerFactory"
        jndi-name="java:jpa/myEntityMng" />

    <bean name="daoAuthor"
        class="com.dataart.gdubina.web.dao.DaoAuthorImpl">
        <property name="entityManagerFactory"
            ref="entityManagerFactory">
        </property>
    </bean>

    <bean name="daoBook"
        class="com.dataart.gdubina.web.dao.DaoBookImpl">
        <property name="entityManagerFactory"
            ref="entityManagerFactory">
        </property>
    </bean>

    <bean name="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory"
        ref="entityManagerFactory" />
        </bean> 


    <bean name="service"
        class="com.dataart.gdubina.web.service.DaoService">
        <property name="daoAuthor" ref="daoAuthor"></property>
        <property name="daoBook" ref="daoBook"></property>
    </bean>
    
    <tx:annotation-driven />

вызываю метод класса
Код

public class DaoAuthorImpl extends DaoEntityImpl<Author> implements DaoAuthor

вызывается метод
Код

public Author addAuthor(String name,String surname){
    Author a = new Author(name,surname);
    this.save(a);
    return a;
}

где в классе 
Код

public class DaoEntityImpl<T> extends JpaDaoSupport implements DaoEntity<T>

реализован метод
Код

@Transactional(readOnly=false)
public void save(T entity) {
  getJpaTemplate().persist(entity);
}

причем используется анатация @Transactional что по сути должно было посути сделать JpaTemplate транзакционным.
2 дня уже бьюсь над проблемой. вся надежда на вас граждане. smile

Автор: kosmonaFFFt 25.3.2010, 20:34
Ап...
Столкнулся с той-же проблемой...
Имеется:
Код

import dao.interfaces.JfrmUserDAO;
import entityes.JfrmUser;
import javax.persistence.EntityManager;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.orm.jpa.support.JpaDaoSupport;

/**
 *
 * @author kosmonaffft
 */
@Transactional(propagation = Propagation.REQUIRED)
public class JfrmUserDAOImpl extends JpaDaoSupport implements JfrmUserDAO {

    public JfrmUser findByName(String username) {
        return null;
    }

    public void addUser(JfrmUser user) {
        EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager();
        //em.getTransaction().begin();
        em.persist(user);
        //em.getTransaction().commit();
    }
}


Код

<bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/jdbc.properties" />

    <bean id="jfrmDataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}" />

    <bean id="emFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:dataSource-ref="jfrmDataSource"  />

    <bean id="txManager"
          class="org.springframework.orm.jpa.JpaTransactionManager"
          p:entityManagerFactory-ref="emFactory" />

    <tx:annotation-driven transaction-manager="txManager" />

    <bean id="jfrmUserDAO"
          class="dao.impls.JfrmUserDAOImpl"
          p:entityManagerFactory-ref="emFactory" />


Если создавать транзакцию вручную (закомментированные строки), то все работает, иначе объект просто не добавляется в базу...

Автор: afon 27.3.2010, 18:06
смахивает на то, что вы вызываете em.persist(user) а не свой аннотированный транзакцией save(T entity)

по второму примеру в методе addUser: я не использовал JpaDaoSupport, но что-то мне подсказывает, что вам не нужно делать 
EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager();
а использовать getJpaTemplate() напрямую. То есть, например getJpaTemplate().create(user, JfrmUser.class), тогда заведутся ваши транзакции.

Автор: kosmonaFFFt 28.3.2010, 18:01
Точно, завелись... Спасибо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)