java - oracle.jdbc.OracleDatabaseException:ORA-01400:无法将 NULL 插入
问题描述
这是我的实体类,当我运行项目时会自动映射 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制作了IDENTITY,它仍然无法正常工作。
这是我的代码,在这里我以大摇大摆的方式发送文件扩展名,如下所示:
C:\Users\anar.memmedov\Desktop\file2.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_ID | 创建日期 | 电话号码 | TEXT_MESSAGE |
---|---|---|---|
我不知道发生了什么,但是当我使用 mysql 数据库时它起作用了,我的意思是,我正在获取 excel 文件,将其中的值写入数据库,然后成功地将 excel 文件提取到我计算机上的文件夹中。但是现在我无法解决这个错误,因为我使用的是 oracle。
解决方案
错误说:
无法将 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
,但它可能是主键。我不认为这实际上是一个选项
推荐阅读
- php - Symfony\Component\Debug\Exception\FatalThrowableError 类 '\App\Admin' 未找到
- javascript - 如何通过 JavaScript 使用引导选项卡来激活选项卡提交的表单
- php - PHP 检查一个数字是否在序列中但缺少一个
- c++ - 没有进程间通信(ipc)的继承句柄有什么意义?
- java - GetParts() 在 servlet 中返回 null
- swift - 如何将分段控制设计从方形更改为圆形
- arrays - Swift 中每隔一个奇数数组
- bash - Bash on macOS - 获取给定年份每个星期六的日期列表
- c# - 编码和解码奇怪的.shm文件数据到base64 c#
- java - ArCore 成功楼层查找