映射JPA复合外键

时间:2016-10-12 13:26:05

标签: java jpa

我是JPA的新手,想要创建一个具有这种关系的数据库:

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

|Event|
|id : INT (PK) |

我完全迷失了,几乎没有弄清楚我找到的例子的语法:/

但我知道我需要创建另一个类来包含PK的两个部分,这导致另一个问题:这个类可以是内部类(为了优化目的)吗?

我希望我不要求太多,但我真的很想得到它。

2 个答案:

答案 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
}

我希望这会有所帮助。