#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;
Компания
Человек