У меня есть следующие объекты:
@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_, которое не может быть обнуляемым. Я продолжаю свое расследование, почему это