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

保存Spring实体时的java.lang.NullPonterException,spring,hibernate,spring-boot,spring-data-jpa,Spring,Hibernate,Spring Boot,Spring Data Jpa,我尝试读取Excel文件并将数据保存在postgres数据库中。在某些文件中,我收到以下错误消息: java.lang.NullPointerException:null 在de.hspf.讲师服务.semestertock.semestertock.hashCode(semestertock.java:51)~[classes/:na] 在java.lang.Object.toString(Object.java:236)~[na:1.8.0_161] 在java.lang.String.va

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

java.lang.NullPointerException:null 在de.hspf.讲师服务.semestertock.semestertock.hashCode(semestertock.java:51)~[classes/:na] 在java.lang.Object.toString(Object.java:236)~[na:1.8.0_161] 在java.lang.String.valueOf(String.java:2994)~[na:1.8.0_161] 在java.lang.StringBuilder.append(StringBuilder.java:131)~[na:1.8.0_161] 在org.hibernate.pretty.MessageHelper.infoString(MessageHelper.java:57)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.ununiqueobjectexception.getMessage(ununiqueobjectexception.java:61)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:123)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:933)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.SessionImpl.merge(SessionImpl.java:892)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:490)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:415)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:216)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:523)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:455)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:418)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:216)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.engine.internal.Cascade.Cascade(Cascade.java:149)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:460)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:202)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:176)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:900)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] 在org.hibernate.internal.SessionImpl.merge(SessionImpl.java:886)~[hibernate-core-5.3.9.Final.jar:5.3.9.Final] at sun.reflect.GeneratedMethodAccessor88.invoke(未知源)~[na:na] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0¡] 在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.0_161] 在org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:308)~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE] 在com.sun.proxy.$Proxy116.merge(未知源)~[na:na] 在org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:492)~[spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE] at sun.reflect.GeneratedMethodAccessor86.invoke(未知源)~[na:na] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0¡] 在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.0_161] 在org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:644)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)~[spring-aop-5.1.6.RELEASE.jar:5.1.6.RELEASE] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)~[spring-aop-5.1.6.RELEASE.jar:5.1.6
@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());
    }