JPA不会使用@Transactional注释保存选择结果

时间:2019-09-07 21:33:52

标签: java spring hibernate jpa

我无法在Spring Boot应用程序中使用JPA将选择结果保存到数据库中。我使用的代码如下:

@Override
@Transactional
public void fetchAndSave() {
    List<TestData> all = testDataRepository.findAllRecords();
    testDataRepository.saveAll(all);
    // let suppose I will save another data here that's why I need @Transactional for roll-back in case of exception
}
@Repository
public interface TestDataRepository extends JpaRepository<TestData, Long> {
    @Query(value = "select raw_values.identificator AS id, raw_values.name as value from test.raw_values", nativeQuery = true)
    List<TestData> findAllRecords();
}

当我调用具有属性fetchAndSave的{​​{1}}时,在日志中只能看到选择:

spring.jpa.show-sql=true

在不使用Hibernate: select raw_values.identificator AS id, raw_values.name as value from test.raw_values 的情况下,我可以在日志中看到对数据库的更多请求并保存了值:

@Transactional

我在数据库中有一个非常简单的表,DDL看起来像:

Hibernate: select raw_values.identificator AS id, raw_values.name as value from test.raw_values
Hibernate: select testdata0_.id as id1_0_0_, testdata0_.value as value2_0_0_ from test.test_data testdata0_ where testdata0_.id=?
Hibernate: select testdata0_.id as id1_0_0_, testdata0_.value as value2_0_0_ from test.test_data testdata0_ where testdata0_.id=?
Hibernate: select testdata0_.id as id1_0_0_, testdata0_.value as value2_0_0_ from test.test_data testdata0_ where testdata0_.id=?
Hibernate: insert into test.test_data (value, id) values (?, ?)
Hibernate: insert into test.test_data (value, id) values (?, ?)
Hibernate: insert into test.test_data (value, id) values (?, ?)

您能帮我找出这种行为的原因吗?我希望在使用create table test_data ( id serial not null constraint test_data_pk primary key, value varchar(256) ); -- There are 3 records in table raw_values create table table_name ( identificator integer not null constraint table_name_pk primary key, name varchar(256) ); 时将记录保存到数据库中。

1 个答案:

答案 0 :(得分:3)

“为什么不保存”的简短答案是:因为它们已经保存。

更长的答案是Hibernate看到这些ID已存在于数据库中,并且不保存它们。

如果要向数据库插入另外三个实体,只需使用string value = "The problem string"; value = value.Replace("\u2022", "-"); value = value.Replace("\u2013", "-"); value = value.Replace("\u2014", "-"); value = value.Replace("\u2015", "-"); value = value.Replace("\u2017", "_"); value = value.Replace("\u2018", "'"); value = value.Replace("\u2019", "'"); value = value.Replace("\u201a", ","); value = value.Replace("\u201b", "'"); value = value.Replace("\u201c", "\""); value = value.Replace("\u201d", "\""); value = value.Replace("\u201e", "\""); value = value.Replace("\u2026", "..."); value = value.Replace("\u2032", "'"); value = value.Replace("\u2033", "\""); 为这些对象创建副本并保存它们:

id=null