у меня есть отношение таблицы 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;
как правильно сопоставить таблицу отношений в спящем режиме?
@XtremeBaumer каждый узел (id) может иметь несколько родителей, а также дочерних элементов. Итак, в таблице отношений у нас будут такие записи, как; 1 -> ноль; 2 -> ноль; 3 -> 1; 4-> 1 ; 6 -> 4; 8 -> 4;
Как вы различаете родителей и детей? Обновите свой вопрос некоторыми правильно отформатированными примерами для таблицы отношений. Также укажите, как вы ожидаете, что данные будут возвращены
@XtremeBaumer обновлен, запросы будут выглядеть как выбор a_id из отношения, где a_parent_id=$;
Поскольку вы указали, что у вас может быть несколько детей/родителей, и, судя по данным примера, я решил использовать List
s родителей/детей вместо того, чтобы просто связывать отношения.
@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
(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.
из здесьэто не позволяет мне добавлять нулевые значения для a_parent_id, как я могу сохранить ограничение FK, только если запись не является нулевой
Нет необходимости добавлять нулевые значения в качестве родительского/дочернего идентификатора, потому что это то же самое, что и полное отсутствие записи.
я также хочу, чтобы (a_id + a_parent_id) был уникальным в таблице отношений. пожалуйста, опишите, как я могу добиться того же.
составной первичный ключ гарантирует, что
не понял, как создать составной первичный индекс для таблицы отношений. но смог добиться того же, используя @uniqueconstraint
ТБХ, вам вообще не нужен этот стол. Похоже, вы хотите, чтобы отношения родитель-потомок были одного типа. Для этого вам нужен только столбец
parentId
в вашемtest_table
и в вашем коде, который вы используете@OneToOne @JoinColumn(name = "parentId") private TestTable parent;