Spring Em.persist () не вставляется при тестировании настройки БД - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь запустить некоторые тесты в своем веб-приложении Spring, и, похоже, у меня возникли некоторые проблемы при первоначальной вставке записей в БД для использования с моими тестами. Моя установка выглядит следующим образом:

Настройка модульного теста, расширяющая TestBase:

@Before
public void setup() {
    setupBase();
    configurationDao = (ConfigurationDao)ctx.getBean("configDao");       
    setupReasons(configurationDao.getEm());
}

TestBase:

public class TestBase {

    protected ApplicationContext ctx;

    public void setupBase() {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    public static String getRandomUUIDStyleId() {
        return UUID.randomUUID().toString().substring(0, 24);
    }

    @Transactional
    public void setupReasons(EntityManager em) {
        DateTime now = new DateTime();
        for (Reason reason : Reasons.values()) {
            ReasonEntity r = new ReasonEntity();
            r.setId(reason.ordinal());
            r.setReason(reason.name());
            em.persist(r);
        }
    }
}

BaseDao, конфигурация которого распространяется:

public abstract class BaseDao<T extends EntityBase> implements Dao<T> {

    @PersistenceContext
    protected EntityManager em;
    protected Class<T> entityClass;

    @Transactional
    public T findById(long id) {
        return em.find(entityClass, id);
    }

    @Transactional
    public List<T> findAll() {
        Query query = em.createQuery("from " + entityClass.getName());
        return (List<T>) query.getResultList();
    }

    @Transactional
    public T persistOrMerge(T entity) {
        if (entity.getId() == null || entity.getId() == 0) {
            //System.out.println("Persisting: "+entity.toString());
            em.persist(entity);
        } else {
            if (!em.contains(entity)) {
                //System.out.println("Merging: "+entity.toString());
                return em.merge(entity);
            }
        }
        return entity;
    }

    public void remove(T entity) {
        em.remove(entity);
    }

    public EntityManager getEm() {
        return em;
    }
}

applicationContext.xml:

<bean id="configDao" class="ConfigurationDao" />
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" >
        <property name="persistenceUnitName" value="TEST-pu" />
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"  />

Хотя setupReasons «кажется» сохраняется, он никогда не вставляет данные в таблицу MySql (видимую через свойство hibernate showsql), и я не могу понять, почему. Заранее благодарен за вашу помощь, и если вам нужно что-то еще от меня, я более чем рад предоставить.

Ответы [ 3 ]

0 голосов
/ 26 августа 2011

Следуйте этому руководству, чтобы сделать транзакцию с классами теста осведомленной, используя spring:

http://static.springsource.org/spring/docs/2.5.x/reference/testing.html

Используйте p6spy для проверки того, что именно отправляется в базу данных, включая операторы запуска и фиксации транзакции.

p6spy | http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/

0 голосов
/ 04 февраля 2014

Для тех, кто все еще сталкивается с этой проблемой, просто поместите аннотацию @TransactionConfiguration в своем классе и все!

Проверьте это на @ TransactionConfiguration

0 голосов
/ 26 августа 2011

Несмотря на то, что setupReasons () помечен @Transactional, я не вижу ничего, что могло бы заставить меня думать, что для него запускается транзакция. Без транзакции ничего не будет написано. Возможно, вы захотите прочитать в тестовой среде Spring .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...