我无法在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)
);
时将记录保存到数据库中。
答案 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