Я использую следующий технический стек:
- spring-boot-starter-data-jpa
- HikariCP для пула соединений
- Oracle DB
Мой настоящий код выглядит примерно так:
/// My trigger looks like this
CREATE OR REPLACE TRIGGER FILE_BRI
BEFORE INSERT
ON FILE
FOR EACH ROW
BEGIN
SELECT FILE_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
///
public class FILE implements Serializable {
@Id
@SequenceGenerator(
name = "FILE_SEQ",
sequenceName = "FILE_SEQ",
allocationSize = 1)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "FILE_SEQ"
)
private long id;
}
public class ServiceA () {
@Transactional(propagation = REQUIRES_NEW, isolation = READ_COMMITTED)
public File insertFile() {
// Below line returns the inserted File object with ID as '58496'
return fileRepository.save(file)
}
@Transactional(propagation = REQUIRES_NEW, isolation = READ_COMMITTED)
public AccessControl insertAccessControl() {
// Below line results in 'SQLIntegrityConstraintViolationException' (full error at the bottom of this post)
return accessControlRepository.save(accessControlFile)
}
}
Public class FileProcessor() {
ServiceA serviceA;
public void someMethod() {
// insert the file and get the inserted record
File insertedFile = serviceA.insertFile(file);
// get the ID from the inserted file and make another insert into another table
serviceA.insertAccessControl(insertedFile.getId()); // inserted file ID is '58496'
}
}
Это мое расследование:
Когда я проверил идентификатор вставленной записи вТаблица "FILE" - это "58497", однако repository.save()
вернул другое значение.Когда я выполняю вторую вставку в таблицу «ACCESS_CONTROL_FILE» с FILE_ID
в качестве «58496», это приводит к ошибке, указанной ниже, поскольку ФАЙЛ с идентификатором «58496» не существует.
Причина:java.sql.SQLIntegrityConstraintViolationException: ORA-01400: невозможно вставить NULL в ("DB_OWNER". "ACCESS_CONTROL_FILE". "FILE_ID")
Я озадачен, почему repository.save()
возвращает другоеID (т.е. ID = 58496), чем то, что фактически вставлено (ID = 58497) в базу данных!
Я исследовал все варианты, которые я мог найти в Интернете, связанные с «Распространением и изоляцией».