2017-06-09 129 views
2

在一個單元測試,我試圖刪除通過Spring的CrudRepository從我的數據庫中的條目,但它似乎像什麼也沒有發生。春CrudRepository刪除()什麼也不做

實體:

@Entity @Table(name = "FACTION") 
public class Faction implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", columnDefinition = "int", nullable = false, unique = true) 
    private Integer id; 

    public Integer getId() 
    { 
     return this.id; 
    } 
} 

存儲庫:

public interface FactionDao extends CrudRepository<Faction, Integer> 
{ 

} 

我的測試類:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = Config.class) 
@Sql({ "/delete-testData.sql", "/insert-testData.sql" }) 
public class TestFactionDao 
{ 
    @Autowired 
    private FactionDao dao; 

    @Test 
    public void testDelete() 
    { 
     System.out.println(this.dao.findOne(1)); 
     this.dao.delete(1); 
     System.out.println(this.dao.findOne(1)); 
    } 
} 

Spring配置:

@Configuration 
@EnableJpaRepositories(basePackageClasses = Config.class) 
@EnableTransactionManagement 
public class Config 
{ 
    @Bean 
    public DataSource dataSource() 
    { 
     return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(DataSource pDataSource) 
    { 
     return new DataSourceTransactionManager(pDataSource); 
    } 

    @Bean 
    LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource pDataSource) 
    { 
     HibernateJpaVendorAdapter tJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     tJpaVendorAdapter.setDatabase(Database.H2); 
     tJpaVendorAdapter.setGenerateDdl(true); 
     tJpaVendorAdapter.setShowSql(true); 
     LocalContainerEntityManagerFactoryBean tEntityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
     tEntityManagerFactory.setJpaVendorAdapter(tJpaVendorAdapter); 
     tEntityManagerFactory.setDataSource(pDataSource); 
     tEntityManagerFactory.setPackagesToScan(Config.class.getPackage().getName()); 
     return tEntityManagerFactory; 
    } 
} 

SQL腳本:

-- delete-testData.sql 

delete from FACTION; 

-- insert-testData.sql 

insert into FACTION (ID) values 
(1); 

下面是測試例中的控制檯輸出。正如你所看到的,不執行刪除操作,我仍然可以閱讀我剛剛刪除的實體:

Hibernate: create table FACTION (ID int generated by default as identity, primary key (ID)) 
Hibernate: select faction0_.ID as ID1_3_0_ from FACTION faction0_ where faction0_.ID=? 
[email protected] 
Hibernate: select faction0_.ID as ID1_3_0_ from FACTION faction0_ where faction0_.ID=? 
Hibernate: select faction0_.ID as ID1_3_0_ from FACTION faction0_ where faction0_.ID=? 
[email protected] 

我試圖annoting我的@Rollback(假)的測試方法,但它似乎並沒有做任何區別。調用dao上的flush()會引發異常,表示沒有掛起的更新。

回答

1

我測試你的代碼,並且解決方案是將TransactionManager類型從PlatformTransactionManager更改爲JpaTransactionManager。 (我認爲,當函數結束,也許只有PlatformTransactionManager的承諾刪除。)

因此,代碼爲:

Config.java

@Bean 
public JpaTransactionManager transactionManager(EntityManagerFactory emf) { 
    return new JpaTransactionManager(emf); 
} 

@Bean 
LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource pDataSource) { 
    HibernateJpaVendorAdapter tJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    ... 
+1

這樣做。我猜這個錯誤不會發生在生產中,因爲我可以使用容器管理的事務。 – Iavra

0

必須爲updatedelete操作添加交易。

public class FactionService { 
    @Autowired 
    private FactionDao dao; 

    @Transactional 
    public void delete(int id){ 
     dao.delete(id); 
    } 
} 
+0

如果我添加@Transactional的方法(無論是春季或持久性一)刪除失敗與「org.springframework.dao.EmptyResultDataAccessException:沒有類de.iavra.data.Faction實體與id 1存在!」。它似乎沒有找到我在該方法之前插入的測試數據。 我以爲,春數據處理在倉庫裏的交易,所以我不必事務添加到我的方法。 – Iavra