Как создать объект с несколькими родительскими объектами, используя реактивный режим Hibernate?
Я пытаюсь создать модель данных, используя реактивный режим гибернации, где один объект владеет двумя другими объектами, и каждый из этих двух объектов имеет связь «один ко многим» с четвертым объектом. Вот пример того, как будут созданы таблицы:
@Entity
@Table(name = "OBJECT_A")
public class ObjectA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "OBJECT_A_ID")
public Set<ObjectB> objectBs;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "OBJECT_A_ID")
public Set<ObjectC> objectCs;
}
@Entity
@Table(name = "OBJECT_B")
public class ObjectB {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public Long id;
@OneToMany(mappedBy = "objectB", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<ObjectD> objectDs;
}
@Entity
@Table(name = "OBJECT_C")
public class ObjectC {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public Long id;
@NotBlank
@Column(name = "NAME")
public String name;
@OneToMany(mappedBy = "objectC", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<ObjectD> objectDs;
}
@Entity
@Table(name = "OBJECT_D")
public class ObjectD {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public Long id;
@ManyToOne
@JoinColumn(name = "OBJECT_B_ID", nullable = false)
public ObjectB objectB;
@ManyToOne
@JoinColumn(name = "OBJECT_C_ID", nullable = false)
public ObjectC objectC;
}
Я думаю, что эта структура таблицы работает нормально. Я просто не могу понять, как на самом деле сохранять данные по этой модели в базе данных. Обычно я просто получаю ObjectA с уровня API и вызываю для него session.persist, а поскольку все является CascadeType.ALL, все дочерние объекты просто сохраняются. Проблема, с которой я столкнулся, заключается в том, что с помощью JSON Rest API вы не можете реально представить идею ObjectD, имеющего два разных родительских объекта. В структуре JSON ObjectD является дочерним элементом ObjectB, а затем у меня есть обратная ссылка на ObjectC как часть ObjectD. Вот пример объекта A в формате JSON:
{
"objectBs": [
{
"objectDs": [
{
"objectC": {
"name": "example_name"
}
}
]
}
],
"objectCs": [
{
"name": "example_name"
}
]
}
Как вы можете видеть, ObjectC в списке objectC верхнего уровня и тот, который является частью ObjectD, на самом деле являются одним и тем же объектом. Как мне сохранить представленное выше JSON-представление в базе данных с помощью спящего режима? Я ценю любую помощь. Извините, если этому надуманному примеру немного сложно следовать.