2017-06-09 3 views
2

ユニットテスト中にSpringのCrudRepositoryからデータベースからエントリを削除しようとしていますが、何も起こっていないようです。Spring CrudRepository delete()は何もしません

エンティティ:

@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] 

私は@Rollback(偽)と私のテスト方法をannoting試してみましたが、いずれかを作るようには見えません差。 daoのflush()を呼び出すと、保留中の更新がないという例外がスローされます。

答えて

1

私はあなたのコードをテストし、解決策は、TransactionManagerのタイプをPlatformTransactionManagerからJpaTransactionManagerに変更することです。私はこの方法(どちらか春に@Transactionalを追加する場合

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

か:だからコードが

(。私は、関数が終了したときに多分PlatformTransactionManagerのみ削除をコミットだと思います)永続性1)削除は "org.springframework.dao.EmptyResultDataAccessException:id 1のクラスde.iavra.data.Factionエンティティが存在しません!"で失敗します。 "メソッドの前に挿入されたテストデータが見つからないようです。 私は、Spring Dataがリポジトリ内でトランザクションを処理すると仮定していましたので、私のメソッドにTransactionalを追加する必要はありません。 – Iavra

関連する問題