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
Существует третье решение, которое должно соответствовать вам:
- Передайте детали 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"
}
]
}