Как создать объект с несколькими родительскими объектами, используя реактивный режим 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-представление в базе данных с помощью спящего режима? Я ценю любую помощь. Извините, если этому надуманному примеру немного сложно следовать.

0 ответов

Другие вопросы по тегам