POSTing вложенных объектов с помощью spring данных?

Недавно я начал использовать spring -data-rest для моего приложения. У меня есть следующие объекты JPA:

@Entity
public class Super {
    @Id
    private long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    private List<Child> children;
}

-----------------------------------------

@Entity
public class Super2 {
    @Id
    private long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    private List<Child> children;
}

-----------------------------------------

@Entity
public class Child {
    @Id
    private long id;

    @Column
    private String childMetadata;
}

Я могу вспомнить два метода сохранения новых экземпляров Super или Super2:

  • Выделите @RestResource для Child class → Создайте все экземпляры Child перед созданием экземпляров Super или Super2 → Передайте URL-адреса всех экземпляров Child в полезной нагрузке Super или Super2.
  • Передайте детали Child в полезной нагрузке Super или Super2 без выделения класса @RestResource для Child, а CascadeType.ALL позаботится о создании экземпляров Child.

Есть несколько профи с помощью обоих методов:

  • С опцией 1 я получаю возможность добавлять новые объекты Child к Super или Super2 только с помощью POST с URL-адресом нового Child до http://<server>:<port>/super/1/children. Но я определенно теряю каскадную функциональность базы данных, если я использую этот метод.
  • С вариантом 2 я получаю все каскадные функции базы данных, но я теряю гибкость при добавлении новых экземпляров Child.

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

Спасибо за помощь.:)

Ответ 1

Существует третье решение, которое должно соответствовать вам:

  1. Передайте детали Child в полезной нагрузке Super или Super2, не подвергая @RestResource для атрибута "дети" Super (и Super2).

Вы все равно можете использовать /children, но вы сможете получить детей с супер и опубликовать его!

Чтобы сделать это, просто измените класс Super (и Super2) следующим образом:

public class Super {
    @Id
    @GeneratedValue
    private Long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    @RestResource(exported=false)
    private List<Child> children;

    ...
}

Затем вы можете POST на /supers:

{
    "children": [
        {
            "childMetadata": "inner"
        }
    ]
}