JPA: Как представить JoinTable и составной ключ JoinTable? - PullRequest
0 голосов
/ 04 мая 2018

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

В моей базе данных есть таблица User и таблица Following.

Таблица Following имеет только два значения: followUserId и followUserId.

В Java у меня есть класс User. Большинство уроков, которые я вижу, включают один объект, содержащий набор объектов, с которыми он связан. Многие учебные пособия могут описать, как иметь пользователей, которые следуют за этим пользователем, и за множеством пользователей, за которыми следует пользователь. Но для этого потребуется много памяти.

Я имею в виду альтернативную структуру, в которой у объекта User нет информации о следующем. Вместо этого есть объект Follow, который выглядит следующим образом

@Entity
@Table(name = "Following")
public class Following {
    RegisteredUser follower;
    RegisteredUser followed;
}

и соответствует таблице соединений. Когда я хочу получить всех подписчиков пользователя, я могу сделать запрос для всех объектов «Подписки» с этим пользователем в качестве подписчика.

Мои проблемы:

  1. Таблица подписчиков содержит составной ключ каждого из двух идентификаторов пользователей. Как я могу использовать аннотации для представления этого составного ключа? Аннотация @Id обозначает одну переменную в качестве ключа

  2. Как я могу сделать такой запрос?

Если это актуально, я использую MySQL в качестве базы данных

1 Ответ

0 голосов
/ 04 мая 2018

Если вы используете JPA> 2.0, вы можете пометить отношения как свой идентификатор:

@Entity
@Table(name = "Following")
@IdClass(FollowingId.class)
public class Following {
    @Id
    RegisteredUser follower;
    @Id
    RegisteredUser followed;
}

public class FollowingId implements Serializable {
    private int follower;
    private int followed;
}

типы в следующем классе должны соответствовать типу RegisteredUser Id. Существует множество более сложных примеров, если вы выполняете поиск по производному идентификатору JPA.

Для запросов это зависит от того, что вы ищете. С помощью JPQL можно получить коллекцию подписчиков для конкретного пользователя:

"Select f.follower from Following f where f.followed = :user"
...