Отображение составного внешнего ключа JPA

#java #jpa

#java #jpa

Вопрос:

Я новичок в JPA и хочу создать базу данных с этим отношением :

 |Participant|
|id : INT (PK) | id_event : INT (PK, FK) |

|Event|
|id : INT (PK) |
  

Я полностью потерян и едва понимаю синтаксис примеров, которые я нашел :/

Но я понял, что мне нужно создать другой класс, содержащий две части PK, что приводит к другому вопросу: может ли этот класс быть внутренним классом (для целей оптимизации)?

Надеюсь, я не прошу слишком многого, но я действительно хочу это получить.

Комментарии:

1. Участник и Событие имеют много-много общего? Затем вам понадобится другая сущность, и эта новая сущность должна будет включать два идентификатора в качестве составного первичного ключа.

Ответ №1:

Ваши сущности могут быть такими:

 @Entity
public class Participant {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY)    // or any other relation
    private List<Event> events;

    // fields, constructors, getters, setters
}

@Entity
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // fields, constructors, getters, setters
}
  

В этом случае JPA создаст 3 таблицы со следующими запросами (диалект SQL будет варьироваться от базы данных к базе данных, в данном случае я использовал базу данных H2):

 CREATE TABLE Event (
  id bigint GENERATED BY DEFAULT AS IDENTITY,
  PRIMARY KEY (id)
);

CREATE TABLE Participant (
  id bigint GENERATED BY DEFAULT AS IDENTITY,
  PRIMARY KEY (id)
);

CREATE TABLE Participant_Event (
  Participant_id bigint NOT NULL,
  events_id      bigint NOT NULL
)
  

Participant_Event автоматически создается таблица соединений для связи участников и событий.

Вот хороший пример понимания отношений сущностей JPA.

Комментарии:

1. Спасибо вам за вашу помощь, но он говорит мне The type of field "x.x.x.x.Participant.event" isn't supported by declared persistence strategy "OneToMany". Please choose a different strategy. : (

2. пожалуйста, попробуйте еще раз, я обновил свой ответ. Но на самом деле я не знаю, какие отношения вы должны использовать, это зависит от ваших целей и требований. Вы можете прочитать статью и принять решение. Еще один хороший иллюстрированный учебник — отношения JPA — Entity .

3. Что ж.. Он сказал "x.x.x.x.Participant.events" declared that it is mapped by "participant", but that is a not a field of the related type. , поэтому я попробовал использовать id вместо этого, но потом он сказал Collection field "x.x.x.x.Participant.events" declares that it is mapped by "x.x.x.x.Event.id", but this is not a valid inverse relation. , что я полностью заблудился, должен признать…

4. Пожалуйста, не расстраивайтесь, я удалил отображение и добавил описание того, какие таблицы будут созданы, пожалуйста, посмотрите еще раз, теперь это работает.

5. Хорошо, это кажется действительно близким, за исключением того, что он записывает идентификатор в другой строке ^^ В любом случае, я загляну в него поглубже, но это кажется правильным решением моей проблемы. Спасибо!

Ответ №2:

Для отношения OneToMany вам понадобятся следующие объекты и таблицы:

  • Участник
  • Событие

Event Сущность проста:

 @Entity
public class Event {
    @Id
    private Long id;

    // fields, constructors, getters, setters
}
  

Объект Participant должен содержать составной ключ (он же две части PK), поэтому каждый Participant из них связан с событием только один раз.

 @Entity
public class Participant {
    @EmbeddedId
    private EventParticipantPK id;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Event> events;

    // fields, constructors, getters, setters
}
  

Составной ключ объявляется как EmbeddedId .

EventParticipantPK должен выглядеть следующим образом:

 @Embeddable
public class EventParticipantPK {
    @Column (name = "PARTICIPANT_ID")
    private Long participantId;

    @Column (name = "EVENT_ID")
    private Long eventId;

    // fields, constructors, getters, setters
}
  

Я надеюсь, что это поможет.