Поле не имеет значения по умолчанию hibernate sql исключение - PullRequest
0 голосов
/ 17 января 2020

У меня есть следующие объекты:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
@Data
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(updatable = false, nullable = false)
    protected Long id;

    ...
}
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class Employee extends BaseEmployee {

    @Column
    private String email;

    ...

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "job_id")
    private EmployeeJob job;

    public Employee() {
    }
}
@Entity
@Table(name = "sigma_pattern_scorings")
@Data
public class SigmaPatternScoring extends BaseEntity {

    @OneToOne
    @MapsId
    private EmployeeJob job;

    ...
}
@Entity
@Table(name = "employee_jobs")
@Data
public class EmployeeJob extends BaseEntity {

    @Column(name = "code", unique = true)
    private String code;

    ...

    @OneToMany(mappedBy = "job")
    private Set<Employee> employees;


    @OneToOne(mappedBy = "job", cascade = CascadeType.ALL)
    private SigmaPatternScoring sigmaPatternScoring;
}

У меня есть репозитории Spring data jpa для обоих объектов. Я пытаюсь сохранить объекты в БД с помощью следующего кода:

@NoRepositoryBean
public interface BaseRepository <T extends BaseEntity> extends JpaRepository<T, Long> {
    List<T> findByActive(boolean active);
    Optional<T> findByIdAndActiveTrue(Long id);
}

public interface EmployeeRepository extends BaseRepository<Employee> {
    Employee findByEmail(String email);
}
@Repository
public interface EmployeeJobRepository extends JpaRepository<EmployeeJob, Long> {

}
@SpringBootApplication
public class MindwireApp {
    private static final Logger log = LoggerFactory.getLogger(MindwireApp.class);

    public static void main(String[] args) {
        SpringApplication.run(MindwireApp.class, args);
    }

    @Bean
    public CommandLineRunner run(EmployeeRepository employeeRepository, EmployeeJobRepository jobRepository) throws Exception {
          return args -> {
              Employee emp = new Employee();
              emp.setEmail("sashatesst@mindwire.com");
              emp.setFirstName("firstname");
              emp.setMiddleName("middlename");
              emp.setHireDate(new Date());

              ...

              EmployeeJob job = new EmployeeJob();
              job.setCode("job1");
              job.setCognitiveTarget((short) 200);
              job.setName("software engineer");

              ...

              emp.setJob(job);

              SigmaPatternScoring sigmaPatternScoring = new SigmaPatternScoring();
              sigmaPatternScoring.setASigma((float) 1.0);

              ...

              job.setSigmaPatternScoring(sigmaPatternScoring);

              jobRepository.save(job);
              employeeRepository.save(emp);
          };
     }
}

Но я получаю следующую ошибку:

Причина: org .hibernate.exception.GenericJDBCException: не удалось выполнить оператор в org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter. java: 47) ~ [hibernate-core-5.4.9.Final.jar: 5.4.9. Final] в org.hibernate.engine.jdb c .spi.SqlExceptionHelper.convert (SqlExceptionHelper. java: 113) ~ [hibernate-core-5.4.9.Final.jar: 5.4.9.Final] в org .hibernate.engine.transaction.internal.TransactionImpl.commit (TransactionImpl. java: 101) ~ [hibernate-core-5.4.9.Final.jar: 5.4.9.Final] в org.springframework.orm.jpa. JpaTransactionManager.doCommit (JpaTransactionManager. java: 534) ~ [spring-orm-5.2.2.RELEASE.jar: 5.2.2.RELEASE] ... опущено 21 общее число фреймов

Причина: java. sql .SQLException: поле 'job_id' не имеет значения по умолчанию в com. mysql .cj.jdb c .exceptions.SQLError.createSQLE xception (SQLError. java: 129) ~ [mysql -connector- java -8.0.18.jar: 8.0.18] в com. mysql .cj.jdb c .exceptions.SQLError. createSQLException (SQLError. java: 97) ~ [mysql -connector- java -8.0.18.jar: 8.0.18]

Так что я не понимаю, почему он жаловался на поле job_id , потому что значение этого поля должно быть установлено автоматически, когда я подключил этот внешний ключ к первичному ключу таблицы employee_jobs ?

ОБНОВЛЕНИЕ: После включения sql журналов и выполнения тестов с базой данных h2 теперь я вижу, что проблема заключается в сопоставлении сущностей SigmaPatternScoring. С помощью @MapsId для @OneToOne отображение hibernate как-то не устанавливает значение _job_id_, которое не может быть обнуляемым. Я продолжаю свое расследование, почему это

...