Внешние ключи равны нулю для всех детей i

#spring #hibernate #foreign-keys #one-to-many

Вопрос:

У меня есть 2 организации: Компания и Лица, относящиеся ко многим. Когда я сохраняю в бд, все выглядит хорошо рядом со столбцом company_id в persons, который равен нулю (внешний ключ). Перед сохранением объекта в БД я вижу не пустой хэш-набор для человека.

В журналах sql я вижу, что hibernate вставляет null в качестве внешнего ключа в идентификатор компании. Я использую метод сохранения из CrudRepository и @Данных из аннотации ломбока. Я также использую ModelMapper, который не рекомендуется преобразовывать из DTO в сущность, но, как я уже сказал, я могу просмотреть объект компании с лицами (правильные значения, кроме идентификатора, которые в обоих случаях равны нулю — в базе данных идентификатор компании и лица имеют правильное значение).

Когда я удалил «mappedBy», hibernate создает дополнительную таблицу company_persons с правильными значениями company_id и person_id.

Не могли бы вы мне помочь? Я видел здесь несколько подобных вопросов, но не нашел ответа. Заранее спасибо!

Родительский класс

 @Data @Entity @Table(name="company") public class Company extends SourceOriginAbstract {   @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   @NotNull  private String companyName;   @OneToMany(mappedBy = "company",  cascade = CascadeType.ALL,  orphanRemoval = true)  private Setlt;Persongt; persons; }  

Детский класс

 @Data @Entity @Table(name = "person") public class Person extends SourceOriginAbstract {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private long id;   private String firstName;  private String lastName;   @ManyToOne(fetch = FetchType.LAZY)  private Company company;  

Оба класса расширяют исходный код OriginAbstract, который выглядит следующим образом

 @Data @MappedSuperclass public abstract class SourceOriginAbstract {  private SourceType sourceType;  private Source source;  private Date collectDate;  @Temporal(TemporalType.TIMESTAMP)  @UpdateTimestamp  private Date insertDate;  }  

Ответ №1:

Вы не можете ссылаться на родительскую сущность для добавления внешнего ключа дочерней сущности.

Вот ниже приведен пример

 @PostMapping("/someUrl") public String saveData() {  Company company = new Company("Some Company Name");    companyRepository.save(company);   personRepository.save(new Person("Jack", "Ryan", company));  personRepository.save(new Person("James", "Bond", company));   return "redirect:/" }  

Добавить @JoinColumn аннотацию в person сущность

 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "company_id") private Company company;  

Компания

введите описание изображения здесь

Человек

введите описание изображения здесь