2016-10-12 1 views
1

Je suis nouveau avec JPA, et que vous souhaitez créer une base de données avec cette relation:Cartographie JPA Composite clé étrangère

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

|Event| 
|id : INT (PK) | 

Je suis totalement perdu et à peine comprendre la syntaxe des exemples que j'ai trouvé:/

Mais j'ai compris que j'avais besoin de créer une autre classe pour contenir les deux parties du PK, ce qui conduit à une autre question: cette classe peut-elle être une classe interne (à des fins d'optimisation)?

J'espère que je ne demande pas trop mais je veux vraiment l'obtenir.

+0

Le participant et l'événement ont une relation ManyToMany? Ensuite, vous avez besoin d'une autre entité, et cette nouvelle entité devra inclure les deux ID en tant que clé primaire composite. – sanastasiadis

Répondre

1

Vos entités pourraient ressembler à ceci:

@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 
} 

Dans ce cas JPA va créer 3 tables avec les requêtes suivantes (dialecte SQL varie de DB à DB, dans ce cas, je base de données 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 est automatiquement créé table de jointure pour lier les participants et les événements.

Voici un bon exemple de compréhension JPA entity relations.

+0

Merci pour votre aide, mais elle me dit 'Le type de champ" x.x.x.x.Participant.event "n'est pas supporté par la stratégie de persistance déclarée" OneToMany ". S'il vous plaît choisir une stratégie différente. »:( –

+0

s'il vous plaît essayer à nouveau, j'ai mis à jour ma réponse.Mais en fait je ne sais pas quelles relations vous devez utiliser, cela dépend de vos objectifs et exigences.Vous pouvez lire l'article et décider. bon tutoriel illustré est [JPA - Entity Relationships] (https://www.tutorialspoint.com/jpa/jpa_entity_relationships.htm) – DimaSan

+0

Eh bien .. Il a dit «xxxxParticipant.events» a déclaré qu'il est mappé par "participant" , mais ce n'est pas un domaine du type connexe. »J'ai donc essayé avec ** id ** à la place, mais il a dit:« Champ Collection "xxxxParticipant.events" déclare qu'il est mappé par "xxxxEvent.id", mais ce n'est pas une relation inverse valide.'Je suis complètement perdu je dois admettre ... –

1

Pour une relation OneToMany vous avez besoin des entités et tableaux ci-dessous:

  • participant
  • événement

L'entité Event est simple:

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

    // fields, constructors, getters, setters 
} 

L'entité Participant a tenir le clé composite (aka deux morceaux de la PK), donc, chaque Participant est seulement liée une fois avec un événement. La clé composite est déclarée EmbeddedId.

Le EventParticipantPK devrait être comme:

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

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

    // fields, constructors, getters, setters 
} 

J'espère que cela aide.