当前位置: 首页 > 知识库问答 >
问题:

保存spring实体时的java.lang.NullPonterException

轩辕华辉
2023-03-14

我尝试读取ExcelFiles并将数据保存在postgres数据库中。在某些文件中,我会得到以下错误消息:

null

@Entity
public class SemesterLecture implements Serializable {
    @Id
    @ManyToOne
    @JsonIgnore
    @JoinColumn
    private Semester semester;

    @Id
    @ManyToOne
    @JoinColumn
    private Lecture lecture;

    private String grade;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<LectureDateTime> lectureDateTimes;

    public SemesterLecture(Lecture lecture, String grade) {
        this.lecture = lecture;
        this.grade = grade;
    }

    public SemesterLecture() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof SemesterLecture)) return false;
        SemesterLecture that = (SemesterLecture) o;
        return Objects.equals(semester.getTitle(), that.semester.getTitle()) &&
                Objects.equals(lecture.getTitle(), that.lecture.getTitle());
    }

@Override
    public int hashCode() {
        return Objects.hash(semester.getTitle(), lecture.getTitle(), grade);
    }
@EventListener(ApplicationReadyEvent.class)
    @Transactional
    public void readExcelFileFolder() throws IOException, InvalidFormatException, NotFoundException {
        LOG.info("Load Excel Files from folder...");
        FileFilter filter = new ExcelFileFilter ();
        Resource[] resourceFiles = resourcePatternResolver.getResources("classpath:excel-files/*.xls");
        for (Resource resource : resourceFiles) {
            readExcelFile(resource.getInputStream(), resource.getFilename());
        }
    }

    public void readExcelFile(InputStream inputStream, String fileName) throws IOException, InvalidFormatException, NotFoundException {
        Workbook workbook = WorkbookFactory.create(inputStream);
        DataFormatter dataFormatter = new DataFormatter();
        LOG.info("Read Excel File: " + fileName.substring(0, fileName.lastIndexOf('.')));

        Course existingCourse = courseRepository.findByCourseNumber(fileName.replace(" ", "").substring(0, fileName.lastIndexOf('.')));
        if(existingCourse == null){
            return;
        }
        LOG.info("Found course with title " + existingCourse.getCourseTitle());

        if(existingCourse.getSemesters().size() < 1){
            for(int i = 1; i < 8; i++){
                Semester semester = new Semester();
                semester.setTitle("Semester " + i);
                semester.setSemesterLectures(new ArrayList<SemesterLecture>());
                semester.setSemesterNumber(i);
                existingCourse.getSemesters().add(semesterRepository.save(semester));
            }
            LOG.info("Added " + existingCourse.getSemesters().size() + " Semesters");
        }

        for(int y = 0; y < 5; y++){
            Sheet sheet = workbook.getSheetAt(y);
            for (Row row: sheet) {
                String title = dataFormatter.formatCellValue(row.getCell(0));
                String modulNumber = dataFormatter.formatCellValue(row.getCell(1)).replace(" ", "");
                String language = dataFormatter.formatCellValue(row.getCell(2));
                int semesterNumber = 1;
                try{
                    semesterNumber = Integer.parseInt(dataFormatter.formatCellValue(row.getCell(3)).replace(".", ""));
                }catch (Exception e){}
                if(title instanceof String && modulNumber instanceof String && !title.isEmpty() && !modulNumber.isEmpty() && !title.startsWith("Module")){
                    try{
                        if(lectureRepository.existsByModulNumber(modulNumber.replace(" ", ""))){
                            Lecture lecture = lectureRepository.findByModulNumber(modulNumber.replace(" ", ""));
                            SemesterLecture sm = new SemesterLecture(lecture, "0");
                            sm.setSemester(existingCourse.getSemesters().get(semesterNumber-1));
                            sm.setLecture(lecture);
                            sm.setGrade("0");
                            existingCourse.getSemesters().get(semesterNumber-1).getSemesterLectures().add(sm);
                            LOG.info(sm.getLecture().getTitle() + sm.getSemester().getTitle());
                        }
                    } catch (NumberFormatException e) {
                        throw new NotFoundException("Lecture does not exist");
                    }
                }
            }
        }

        for(Semester semester : existingCourse.getSemesters()){
            semesterRepository.save(semester);
        }
        courseRepository.save(existingCourse);
        LOG.info("Saved all lectures from course " + existingCourse.getCourseTitle());
    }

在大多数已爬网的数据中,什么都没有发生。当我尝试保存semster对象时会出现错误。Excel文件的结构如下:标题、模块号、语言、学期号

共有1个答案

葛智敏
2023-03-14

在进行堆栈跟踪时,我认为您有两个问题:

  • 第一个被第二个隐藏的是,您正在尝试保存一个SemesterClacture实例,该实例与html" target="_blank">数据库中已存在的一个实例具有相同的主id(即,对两个SemesterClacture具有相同的值),因此可以在堆栈跟踪中看到NonUniqueObjectException
  • 第二个是,spring在尝试打印NonUniqueObjectException的消息时,通过调用SemesterLeaction类的哈希方法来结束,该实例的字段SEMERT或LEACTION设置为null,因此NullPointerException很好。

我的建议:

首先,删除或注释SemesterPracture类的哈希方法。默认的一个已经足够开始了,它将允许您看到您的原始异常。我的猜测是,在你的学期或你的讲座课hash或equals方法中有一个bug,导致hibernate将两个实体误认为同一个实体。

 类似资料:
  • 我有两个实体 实体1 实体2 我对Jpa不是很熟悉,所以如果您需要对我的问题进行任何澄清,或者您需要任何更多的信息,请告诉我。

  • 我有一个问题,Spring数据没有保存实体。应用程序逻辑如下: 另一个应用程序正在监听负载相当重的Kafka主题(每秒数十条消息)并将消息插入数据库中具有“NEW”状态的表中。 @调度方法加载一个具有“NEW”状态的实体列表,这些实体被一个接一个地传输到FixedThreadPool(20个线程),它们的状态设置为“PROCESSING”和一个saveAll方法调用同一个表。 这两种日志方法都显示

  • 我无法看到我错过配置了什么。 你能告诉我,我可以做什么来解决这个问题,并使实体持久化到数据存储吗?

  • 问题内容: 问题基本上与下面的问题相同: JPA级联仍然存在,对分离实体的引用将引发PersistentObjectException。为什么? 我正在创建一个引用现有的分离实体的新实体。现在,当我将此实体保存在spring数据存储库中时,会引发异常: 如果我们查看Spring数据JPA的源代码中的save()方法,则会看到: 如果我们看一下isNew() 因此,基本上,如果我保存()一个新实体,

  • 我想在Spring Boot 4应用程序中添加缓存。作为一个键,我想使用我的实体的id(type Long),value是我的实体。我的存储库扩展了Crudepository。我缓存findOne方法的数据: 所以我想为实体的方法保存迭代无效缓存(要一致): 但当我把这种方法称为: 我有个例外: -我如何修复这个EL表达式,使缓存中的所有项目无效,其中id在集合中?-如果这是不可能的,如何使这个方

  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。