Я пытаюсь перенести некоторые объекты в новое приложение, которое использует Hibernate, Spring, Hikari pool и SQL Server. Я хочу импортировать те же записи и таким образом сохранить поле IDENTITY. Однако я не могу выполнить SET IDENTITY_INSERT article ON
в том же сеансе, который будет использоваться для объединения объекта. Я всегда получаю следующее исключение Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table 'article' when IDENTITY_INSERT is set to OFF.
Следующий метод находится в выделенном @Service:
@Autowired
ArticleEntityRepository articleEntityRepository;
@Transactional
public void startMigration(){
Article articleToAdd = Article.builder()
.id(1l) // IDENTITY column
.account("bla")
.designation("abc")
.build();
articleEntityRepository.enableInsertIdentity();
articleEntityRepository.saveAndFlush(articleToAdd);
}
Вызывается как таковой с контроллера:
private final MigrationCoordinator migrationCoordinator;
@Autowired
public MigrationExecutor(MigrationCoordinator migrationCoordinator) {
this.migrationCoordinator = migrationCoordinator;
}
@PostConstruct
public void startMigrationProcess() {
migrationCoordinator.startMigration();
}
Репозиторий:
@Repository
public interface ArticleEntityRepository extends JpaRepository<Article, Long> {
@Modifying()
@Query(value = "SET IDENTITY_INSERT article ON", nativeQuery = true)
void enableInsertIdentity();
}
Есть идеи, что мне не хватает?
Изменить: даже следующее приводит к той же ошибке, хотя предполагается, что он использует тот же сеанс :
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void startMigration(){
Session session = entityManager.unwrap(Session.class);
session.joinTransaction();
session.createNativeQuery("SET IDENTITY_INSERT article ON").executeUpdate();
session.createNativeQuery("INSERT INTO article(id, created_by_display_name, created_by_email)\n" +
"VALUES (1, '', ''").executeUpdate();
}