2011-08-26 108 views
0

我試圖在我的Spring web應用程序上運行一些測試,似乎我有一些問題最初在數據庫中插入記錄以使用我的測試。我的設置如下:Spring Em.persist()沒有插入測試數據庫設置

延伸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屬性看到),我似乎無法理解爲什麼。在此先感謝您的幫助,如果您需要我提供的其他內容,我非常樂意提供。

回答

0

儘管setupReasons()標記爲@Transactional,但我沒有看到任何讓我認爲事務正在啓動的事實。沒有交易,什麼都不會寫。您可能需要read up on the Spring test framework

+0

你指的是em.getTransaction.begin()/提交()?據我瞭解@Transactional註釋執行此方法,我是否錯誤假設? – Andrew

+0

@交易並不神奇。你必須有一些東西來掃描和處理註釋,比如我在我的答案中鏈接的Spring測試框架。您發佈的代碼中沒有任何內容會激活它,因此不會開始任何交易。 –

0

對於仍然面臨此問題的人,只需在您的班級中添加註釋@TransactionConfiguration,就是這樣!

檢查出來的@TransactionConfiguration