Правильный способ создания отношений в спящем режиме

у меня есть отношение таблицы mysql со следующими критериями.

id - auto_increment, primary
a_id - FK to test_table primary key, index present
a_parent_id - FK to test_table primary key, index present
(a_id + a_parent_id) has unique constrain

table entries example

a_id a_parent_id
1    null
2    null
3    1
4    1
5    2
6    5
6    4

в настоящее время я сопоставил test_table в спящем режиме

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    @Column
    private String comment;

как правильно сопоставить таблицу отношений в спящем режиме?

ТБХ, вам вообще не нужен этот стол. Похоже, вы хотите, чтобы отношения родитель-потомок были одного типа. Для этого вам нужен только столбец parentId в вашем test_table и в вашем коде, который вы используете @OneToOne @JoinColumn(name = "parentId") private TestTable parent;

XtremeBaumer 28.11.2022 10:26

@XtremeBaumer каждый узел (id) может иметь несколько родителей, а также дочерних элементов. Итак, в таблице отношений у нас будут такие записи, как; 1 -> ноль; 2 -> ноль; 3 -> 1; 4-> 1 ; 6 -> 4; 8 -> 4;

Rajat Aggarwal 30.11.2022 15:10

Как вы различаете родителей и детей? Обновите свой вопрос некоторыми правильно отформатированными примерами для таблицы отношений. Также укажите, как вы ожидаете, что данные будут возвращены

XtremeBaumer 30.11.2022 15:18

@XtremeBaumer обновлен, запросы будут выглядеть как выбор a_id из отношения, где a_parent_id=$;

Rajat Aggarwal 30.11.2022 18:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы указали, что у вас может быть несколько детей/родителей, и, судя по данным примера, я решил использовать Lists родителей/детей вместо того, чтобы просто связывать отношения.

@Entity
@Table(name = "test_table")
public class Test {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    @Column
    private String comment;

    @ManyToMany(targetEntity = Test.class)
    @JoinTable(name = "relation", joinColumns = {
            @JoinColumn(referencedColumnName = "a_id") }, inverseJoinColumns = {
                    @JoinColumn(referencedColumnName = "a_parent_id") })
    private List<Test> parents;

    @ManyToMany(targetEntity = Test.class)
    @JoinTable(name = "relation", joinColumns = {
            @JoinColumn(referencedColumnName = "a_parent_id") }, inverseJoinColumns = {
                    @JoinColumn(referencedColumnName = "a_id") })
    private List<Test> children;

}

Чтобы найти родителей, вы смотрите на таблицу relation с помощью SQL, например

SELECT a_parent_id FROM relation WHERE a_id = ?

Для детей вы переключаете столбцы следующим образом:

SELECT a_id FROM relation WHERE a_parent_id = ?

Это поведение должно быть представлено аннотациями @JoinTable.

не могли бы вы объяснить значение targetEntity

Rajat Aggarwal 02.12.2022 08:56
(Optional) The entity class that is the target of the association. Optional only if the collection-valued relationship property is defined using Java generics. Must be specified otherwise. Defaults to the parameterized type of the collection when defined using generics. из здесь
XtremeBaumer 02.12.2022 09:03

это не позволяет мне добавлять нулевые значения для a_parent_id, как я могу сохранить ограничение FK, только если запись не является нулевой

Rajat Aggarwal 02.12.2022 18:23

Нет необходимости добавлять нулевые значения в качестве родительского/дочернего идентификатора, потому что это то же самое, что и полное отсутствие записи.

XtremeBaumer 05.12.2022 08:21

я также хочу, чтобы (a_id + a_parent_id) был уникальным в таблице отношений. пожалуйста, опишите, как я могу добиться того же.

Rajat Aggarwal 10.12.2022 14:37

составной первичный ключ гарантирует, что

XtremeBaumer 12.12.2022 08:10

не понял, как создать составной первичный индекс для таблицы отношений. но смог добиться того же, используя @uniqueconstraint

Rajat Aggarwal 16.12.2022 18:02

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