Java Spring Em.persist()在测试数据库设置时未插入
我正试图在我的SpringWeb应用程序上运行一些测试,似乎在最初将记录插入数据库以使用测试时遇到了一些问题。我的设置如下: 扩展TestBase的单元测试设置:Java Spring Em.persist()在测试数据库设置时未插入,java,hibernate,spring,jpa,persistence,Java,Hibernate,Spring,Jpa,Persistence,我正试图在我的SpringWeb应用程序上运行一些测试,似乎在最初将记录插入数据库以使用测试时遇到了一些问题。我的设置如下: 扩展TestBase的单元测试设置: @Before public void setup() { setupBase(); configurationDao = (ConfigurationDao)ctx.getBean("configDao"); setupReasons(configurationDao.getEm()); }
@Before
public void setup() {
setupBase();
configurationDao = (ConfigurationDao)ctx.getBean("configDao");
setupReasons(configurationDao.getEm());
}
测试库:
@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);
}
}
}
配置扩展的基本类型:
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看起来是持久的,但它从未将数据插入到通过hibernate showsql属性看到的MySql表中,我似乎不明白为什么。提前感谢您的帮助,如果您还需要我的帮助,我非常乐意提供 尽管setupReasons标记为@Transactional,但我没有看到任何东西让我认为正在为它启动事务。如果没有事务,则不会写入任何内容。您可能需要。遵循本教程,使用spring使您的测试类能够感知事务: 使用p6spy检查发送到数据库的内容,包括启动和提交事务语句
p6spy |对于仍然面临此问题的人,只需将注释@TransactionConfiguration放在类中即可
查看你指的是em.getTransaction.begin/commit吗?据我所知,@Transactional注释在方法上执行此操作,我是否错误地假设了这一点?@Transactional不是魔术。您必须有一些东西来扫描和处理注释,比如我在回答中链接的Spring测试框架。您发布的代码中没有任何内容会激活它,因此不会启动任何事务。