【问题标题】:Spring Em.persist() not inserting on testing db setupSpring Em.persist() 未插入测试数据库设置
【发布时间】:2011-08-26 00:52:47
【问题描述】:

我正在尝试在我的 Spring Web 应用程序上运行一些测试,似乎我最初在数据库中插入记录以使用我的测试时遇到了一些问题。我的设置如下:

扩展 TestBase 的单元测试设置:

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

测试库:

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);
        }
    }
}

Configuration 扩展的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 属性查看),我似乎无法理解为什么。提前感谢您的帮助,如果您需要我提供的任何其他内容,我非常乐意提供。

【问题讨论】:

    标签: java hibernate spring jpa persistence


    【解决方案1】:

    尽管 setupReasons() 被标记为 @Transactional,但我没有看到任何让我认为正在为它启动事务的东西。如果没有事务,则不会写入任何内容。你可能想read up on the Spring test framework

    【讨论】:

    • 你指的是em.getTransaction.begin() / commit()吗?据我了解,@Transactional 注释在该方法上执行此操作,我是否错误地假设了这一点?
    • @Transactional 并不神奇。您必须有一些东西来扫描和处理注释,例如我在答案中链接的 Spring 测试框架。您发布的代码中的任何内容都不会激活它,因此不会启动任何事务。
    【解决方案2】:

    按照本教程使用 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/

    【讨论】:

      【解决方案3】:

      对于仍然面临这个问题的人,只需将注释 @TransactionConfiguration 放在你的类中就可以了!

      查看@TransactionConfiguration

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2019-07-21
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        相关资源
        最近更新 更多