Spring-boot сущность JPA OneToOne, добавляющая нового потомка по отношению к родителю - PullRequest
0 голосов
/ 10 октября 2018

Я не могу понять, как просто связать дочернюю сущность с существующим родителем.

@Entity
@Table(name = "parent")
@Document(indexName = "parent")
public class Parent implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(unique = true)
    private Child child;

    //getters, setters
 }

Ребенок

@Entity
@Table(name = "child")
@Document(indexName = "child")
public class Child implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToOne(mappedBy = "child")
    private Parent parent;

    //getters, setters
 }

Это две основные модели.

Родитель уже существует в базе данных, и я хочу добавить нового дочернего в отношении.

Child childEntity = childRepository.save(child);

Дочерний элемент заполняется следующим образом: child.json

{
   "name": "smallChild", 
   "parent": { "id" : "1" } 
}

Я хочу иметь возможность сохранить дочерний элемент и иметь его автоматически имеющий отношение к родителю.

Я сделал какой-то очень неприятный код ...

  1. Сохранить ребенка без родителя для идентификатора
  2. Запросить базу данных для родителя по идентификатору
  3. Установить дочерний объект для родительского объекта
  4. Сохранить родительский объект с новым дочерним элементом
  5. Установить родительский объект для дочернего объекта
  6. Восстановить дочерний элемент для родительского элемента.

Это закончилось 6-ти минутными запросами к базе данных.

Я пытался посмотреть несколько видео курсов с lynda.com, но это не помогло.

Спасибо!

1 Ответ

0 голосов
/ 10 октября 2018

Требуется либо родительский первичный ключ, либо полная сущность.Если идентификатор родителя доступен, то дополнительный запрос для извлечения родительского объекта не требуется, если целью является просто сохранение.

Если у вас есть идентификатор родителя, доступный для вас, вы можете сохранить дочернюю сущность как:

Child child = new Child();
//...
//Setters for child
//...
//Now just create a parent object and set the id to it
Parent p = new Parent();
p.SetId(parentId); // as the parentId is already vailable
child.setParent(p);
Child childEntity = childRepository.save(child);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...