我是JPA的新手,想要创建一个具有这种关系的数据库:
|Participant|
|id : INT (PK) | id_event : INT (PK, FK) |
|Event|
|id : INT (PK) |
我完全迷失了,几乎没有弄清楚我找到的例子的语法:/
但我知道我需要创建另一个类来包含PK的两个部分,这导致另一个问题:这个类可以是内部类(为了优化目的)吗?
我希望我不要求太多,但我真的很想得到它。
答案 0 :(得分: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方言将因DB而异,在本例中我使用了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 entity relations的一个很好的例子。
答案 1 :(得分:1)
对于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
}
我希望这会有所帮助。