#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
}
Я надеюсь, что это поможет.