Java Spring crudepository delete()不执行任何操作

Java Spring crudepository delete()不执行任何操作,java,spring,hibernate,jpa-2.0,Java,Spring,Hibernate,Jpa 2.0,在单元测试期间,我试图通过Spring的Crudepository从数据库中删除一个条目,但似乎什么都没有发生 实体: @Entity@Table(name=“派系”) 公共类实现了可序列化 { 私有静态最终长serialVersionUID=1L; @Id@GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“ID”,columnDefinition=“int”,nullable=false,unique=true) 私有整数id; 公共整数g

在单元测试期间,我试图通过Spring的Crudepository从数据库中删除一个条目,但似乎什么都没有发生

实体:

@Entity@Table(name=“派系”)
公共类实现了可序列化
{
私有静态最终长serialVersionUID=1L;
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“ID”,columnDefinition=“int”,nullable=false,unique=true)
私有整数id;
公共整数getId()
{
返回此.id;
}
}
存储库:

public接口扩展了crudepository
{
}
我的测试班:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)
@Sql({“/删除testData.Sql”,“/插入testData.Sql”})
公共类testdao
{
@自动连线
私人派系;
@试验
公共void testDelete()
{
System.out.println(this.dao.findOne(1));
此.dao.delete(1);
System.out.println(this.dao.findOne(1));
}
}
弹簧配置:

@配置
@EnableJpaRepositories(basePackageClasses=Config.class)
@启用事务管理
公共类配置
{
@豆子
公共数据源数据源()
{
返回新的EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
@豆子
公共平台transactionManager transactionManager(数据源pDataSource)
{
返回新的数据源TransactionManager(pDataSource);
}
@豆子
LocalContainerEntityManagerFactoryBean entityManagerFactory(数据源pDataSource)
{
hibernatejbavendorapter tjpavendorapter=新的hibernatejbavendorapter();
setDatabase(Database.H2);
tJpaVendorAdapter.setGenerateDdl(true);
tJpaVendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean tEntityManagerFactory=新的LocalContainerEntityManagerFactoryBean();
tEntityManagerFactory.setJpaVendorAdapter(tJpaVendorAdapter);
setDataSource(pDataSource);
tEntityManagerFactory.setPackagesToScan(Config.class.getPackage().getName());
返回TentityManager工厂;
}
}
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=?
de.iavra.data.Faction@1b97f47
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=?
de.iavra.data.Faction@17b8fa4

我试着用@Rollback(false)注释我的测试方法,但似乎没有任何区别。在dao上调用flush()会引发异常,表示没有挂起的更新。

必须为
update
delete
操作添加事务

public class FactionService {
    @Autowired
    private FactionDao dao;

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

我测试了您的代码,解决方案是将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();
     ...

如果我将@Transactional添加到方法(spring或persistence方法),删除将失败,并显示“org.springframework.dao.EmptyResultDataAccessException:不存在id为1的类de.iavra.data.party实体!”。它似乎找不到我在方法之前插入的测试数据。我假设Spring数据在存储库中处理事务,所以我不必将事务添加到方法中。我猜这个错误不会发生在生产中,因为我可以使用容器管理的事务。