У меня есть два объекта, родитель и ребенок. Ребенок имеет внешний ключ обратно в поле PARENT_ID в таблице PARENT (база данных MySQL).Как заполнять значения внешнего ключа в конфигурации Hibernate + Spring JPA, когда родительские/дочерние объекты сохраняются одновременно?
Когда объект родительского и дочернего объектов создается и монтируется одновременно, а вызов сохраняется, внешний ключ дочернего PARENT_ID не заполняется автоматически.
Пример код:
@Entity
@Table(name = "PARENT")
public class Parent {
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany(mappedBy = "parent")
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child {
@Column(name = "CHILD_ID")
private Long childId;
@Column(name = "PARENT_ID")
private Long parentId;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
У меня есть два образца для настойчивости:
1) с использованием Hibernate EntityManager:
@PersistenceContext
EntityManager em;
...
em.persist(parent);
2) Использование экземпляра Spring Data JPA JpaRepository:
public interface ParentRepository extends JpaRepository<Parent, Long> {
}
И в моих ParentServiceImpl:
@Autowired
private ParentRepository parentRepository;
...
public Parent save(Parent parent) {
return parentRepository.save(parent);
}
Какова рекомендуемая стратегия идти о наполнении внешнего ключа? Должен ли объект родительский быть сохранен первым, а затем внешний ключ дочернего объекта, установленный в этой точке? Или есть способ сохранить все это сразу, когда внешний ключ устанавливается автоматически или по ссылке?
Редактировать: Добавлены образцы сохранения.
Редактировать 2 (исправлено!): Проблема решена согласно второму пункту Райана Стюарта. Я удалил поле Long parentId из объекта Child и поместил ссылку @Column для parentId на получателе. Также убедитесь, что правильно настроены ссылки (важно, чтобы Child возвращался к Parent).
Показать код, который используется для сохранения обоих. –
Сделано! В обоих примерах я делаю только один вызов persist. Каскады все работают для обновлений и вставок, где предварительно установлен родительский внешний ключ (сначала сохранен родительский элемент). – skel625
Покажите нам полный код.Как вы создаете родителя и ребенка. Как вы их связываете? Вы говорите о каскадах, но в коде вы не указали. Если вы хотите, чтобы мы объяснили, как ваш код должен быть исправлен, отправьте код, который вы используете. –