Hibernate / JPA Самонаправленная ссылка - PullRequest
0 голосов
/ 22 января 2019

Скажите, у меня есть Person и Friendship объекты JPA.Friendship находится между двумя людьми и содержит информацию, например, когда они встретились, тип их отношений и т. Д.

Из экземпляра Person я хотел бы получить доступ ко всем Friendships, связанным сэтот человек .Заблуждение заключается в том, что дружба - это то, что я называю «бесцельными» отношениями (не совсем верное слово).Дружба между человеком 1 и человеком 2 - это то же самое, что дружба между человеком 2 и человеком 1. Нужно ли мне иметь два отдельных @OneToMany отношения в Person и объединить их как-нибудь или есть лучший способ?

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long personId;

    private String name;

    @OneToMany(mappedBy = "person1")
    private List<Friendship> friendships1;

    @OneToMany(mappedBy = "person2")
    private List<Friendship> friendships2;
}
@Entity
public class Friendship {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    private Person person1;

    @ManyToOne
    private Person person2;

    private Date metOn;

    private String relationshipType;
}

1 Ответ

0 голосов
/ 22 января 2019

Есть несколько способов сделать это, и тот, который вы выберете, вероятно, будет иметь какое-то отношение к вам, как вы хотите обновить отношения.

У вас будет таблица PERSON иеще один называется ДРУЖБА.Таблица FRIENDSHIP будет иметь два столбца, идентифицирующих двух вовлеченных людей.Проблема, в двух словах, заключается в том, что если у вас есть значения X, Y в таблице FRIENDSHIP, это также подразумевает Y, X.

Одна из стратегий состоит в том, чтобы сохранить только одну из двух строк в FRIENDSHIP и определитьправило для определения, какой это.Правило может быть таким: X всегда должно быть меньше Y, поэтому, чтобы установить дружбу между человеком 1 и человеком 2, вы всегда должны хранить 1,2, а не 2,1.Затем вы можете либо определить две коллекции, либо создать представление поверх FRIENDSHIP, которое будет выглядеть примерно так: SELECT P1, P2 FRI FRIENDSHIP UNION SELECT P2, P1 FROM FRIENDSHIP и иметь одну коллекцию, ссылающуюся на это.

Другая стратегияэто просто сохранить X, Y и Y, X в таблице и использовать триггер для добавления второго, когда Hibernate вставляет первый.В этом случае вы можете просто иметь одну коллекцию, ссылающуюся на один из двух столбцов, позволить Hibernate обновить ее и поверить, что база данных исправит ситуацию, чтобы коллекция выглядела правильно с точки зрения другого человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...