oracle.jdbc.OracleDatabaseException:ORA-01400:无法将 NULL 插入

Posted

技术标签:

【中文标题】oracle.jdbc.OracleDatabaseException:ORA-01400:无法将 NULL 插入【英文标题】:oracle.jdbc.OracleDatabaseException: ORA-01400: cannot insert NULL into 【发布时间】:2021-12-03 10:32:54 【问题描述】:

这是我的Entity类,当我运行项目时会自动映射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 CREATED_DATE PHONE_NUMBER TEXT_MESSAGE

我不知道发生了什么,但是当我使用 mysql 数据库时它起作用了,我的意思是,我正在获取 excel 文件,将其中的值写入数据库,然后成功地将 excel 文件提取到我的文件夹中计算机。但是现在我无法解决这个错误,因为我使用的是 oracle。

【问题讨论】:

【参考方案1】:

错误提示:

无法将 NULL 插入 ("TEST3"."TEST"."ID")

你正在插入

INSERT INTO test (PHONE_NUMBER,TEXT_MESSAGE) -->这里没有ID

如果它在 MySQL 中有效但在 Oracle 中无效,我认为 MySQL 的 ID 列是自动生成的,而在 Oracle 中并非如此。

那么,该怎么办?确保ID 以某种方式获得它的价值。

如果您有 Excel 文件,请使用它 如果没有 如果您使用的 Oracle 数据库版本低于 12c,请创建一个数据库触发器,它将使用 序列 将值插入到 ID 列中 如果您使用的是 12c 及更高版本,您可以创建一个 identity 列,其值是自动生成的 如果您不关心 ID(即它可以是 NULL),请删除该约束。可能是NOT NULL,但它可能是主键。我不认为这实际上是这里的一个选项

【讨论】:

我已经自动增加了 Id 列,我不明白为什么要这样做,而且,我只是将值发送到我在插入部分中编写的列。 @AnarMəmmədov - 您的问题没有显示您是如何创建表格的。如果您认为您将数据库设置为自动填充 id 列,请编辑问题以向我们展示您是如何做到的。 Oracle 似乎不同意您将id 设置为标识列。您能否消除您发布的所有代码并成功运行您直接针对数据库发布的insert 语句?我假设你会得到同样的错误。【参考方案2】:

我解决了这个问题。我在我的实体类的 createdDate 变量中将**true** 添加到可为空的并且它起作用了。

【讨论】:

以上是关于oracle.jdbc.OracleDatabaseException:ORA-01400:无法将 NULL 插入的主要内容,如果未能解决你的问题,请参考以下文章