Hivemaster
@Hivemaster
Админ, который хочет программировать

Почему при сохранении каскадом не сохраняются внешние ключи?

Есть у меня два Entity

@Entity
@Table(name = "groups")
public class Group {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    private Company company;

    ...
}

@Entity
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
    private Set<Group> groups = new HashSet<>();

    public void addGroup(final Group group) {
        groups.add(group);
    }

    ...
}

Если я сохраняю каждую по отдельности, то всё в порядке

Company company = companyRepository.save(new Company());

Group group = new Group();
group.setName("Менеджеры");
group.setCompany(company);
groupRepository.save(group);

А если пытаюсь переложить создание групп на плечи Hibernate

Group group = new Group();
group.setName("Менеджеры");

Company company = new Company();
company.addGroup(group);
companyRepository.save(company);

то группы создаются с пустым полем company

db=> select * from groups;
 id |      name      | company_id
----+----------------+------------
  1 | Админы         |
  2 | Менеджеры      |
  3 | Операторы      |

Я ожидал, что Hibernate сам установит связи. Я что-то делаю не так или так и должно быть?
  • Вопрос задан
  • 907 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега PostgreSQL
Седой и строгий
Вам нужно явно присвоить значение полю company:
public void addGroup(Group group) {
    group.setCompany(this);
    groups.add(group);
}

и тогда Hibernate сделает всё остальное.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Braidner
@JoinColumn(name="company_id") забыл
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы