Hibernate - выполнить собственный запрос перед слиянием объекта с сервером SQL - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь перенести некоторые объекты в новое приложение, которое использует 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();
}
...