这是我的实体类,当我运行项目自动映射oracle数据库。
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "test")
public class UserDetail {
@SequenceGenerator(
name = "sequence_name",
allocationSize = 1
)
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence_name"
)
@Column(name = "info_id", length = 11)
private int id;
@Column(name = "phone_number", length = 20)
private String phoneNumber;
@Lob
@Column(name = "text_message")
private String textMessage;
@CreatedDate
@Column(columnDefinition = "TIMESTAMP", nullable = false)
private LocalDateTime createdDate;
}
和我使用更高版本的ORACLE,它仍然不能工作。
这是我的代码,这里我发送一个文件扩展名在swagger如下:
C:Usersanar.memmedovDesktopfile2.xlsx
public Response acceptExcellFileAndInsertToDatabase(String file) {
try (FileInputStream excelFile = new FileInputStream(file)) {
String phoneNumber = "";
String textMessage = "";
Workbook workbook = new XSSFWorkbook(excelFile);
Sheet datatypeSheet = workbook.getSheetAt(0);
Iterator<Row> iterator = datatypeSheet.iterator();
while (iterator.hasNext()) {
Row currentRow = iterator.next();
Iterator<Cell> cellIterator = currentRow.iterator();
while (cellIterator.hasNext()) {
Cell currentCell = cellIterator.next();
if (currentCell.getCellTypeEnum() == CellType.NUMERIC) {
phoneNumber = NumberToTextConverter.toText(currentCell.getNumericCellValue());
} else if (currentCell.getCellTypeEnum() == CellType.STRING) {
textMessage = String.valueOf(currentCell.getStringCellValue());
}
}
}
this.userDetailRepository.save(phoneNumber, textMessage);
excelFile.close();
Path sourcePath = Paths.get(file);
Path targetPath = Paths.get("C:\Users\anar.memmedov\Desktop\ko\" + sourcePath.getFileName());
Files.move(sourcePath, targetPath);
return new SuccessResponse(MessageCase.FILE_SUCCESSFULLY_WRITTEN_TO_DATABASE.getMessage(), 200);
} catch (IOException e) {
e.printStackTrace();
}
return new ErrorResponse(MessageCase.FAILED_HAPPEND_WHEN_FILE_WRITTEN_TO_DATABASE, 404);
}
这是我的存储库方法,我采用excel文件并将其中的值发送到您看到的表中的列,但我得到以下错误:
@Modifying
@Query(value = "INSERT INTO test (PHONE_NUMBER,TEXT_MESSAGE) VALUES (:phoneNumber,:textMessage)", nativeQuery = true)
@Transactional
void save(@Param("phoneNumber") String phoneNumber, @Param("textMessage") String textMessage);
oracle.jdbc.OracleDatabaseException: ORA-01400: cannot insert NULL into ("TEST3"."TEST"."ID")
INFO_IDTEXT_MESSAGE
错误提示:
不能插入NULL到("TEST3"; "TEST";;ID")
你插入
INSERT INTO test (PHONE_NUMBER,TEXT_MESSAGE)——>没有ID列在这里如果它在MySQL中工作,但在Oracle中不工作,我假设MySQL的ID
列是自动生成的,而在Oracle中不是这样。
那么,该怎么办呢?以某种方式确保ID
得到它的值。
- 如果你在Excel文件中,使用 如果不是
- 如果Oracle数据库版本低于12c,创建一个数据库触发器它将使用序列将值插入
ID
列 - 如果你是12c或以上,你可以创建一个标识值为自动生成的列
- 如果Oracle数据库版本低于12c,创建一个数据库触发器它将使用序列将值插入
- 如果你不关心ID(即它可以是
NULL
),删除该约束。可能是NOT NULL
,但也可能是主键。我不认为这个是一个选项
我解决了这个问题。我在我的实体类中添加了**true**
到createdDate变量的nullable,它起作用了。