2016-04-28 73 views
1

ich einen nächsten drei Tabellen (PostgreSQL) haben:JPA ManyToMany Mapping mit zusätzlichen Feldern

CREATE TABLE boards (
    id SERIAL PRIMARY KEY, 
    .... 
); 

CREATE TABLE IF NOT EXISTS cards (
    id SERIAL PRIMARY KEY, 
    name VARCHAR(256), 
    description TEXT, 
    ... 
); 

CREATE TABLE IF NOT EXISTS boards_cards(
    board_id INTEGER, 
    card_id INTEGER, 
    on_hold BOOLEAN DEFAULT FALSE, 
    CONSTRAINT pk_user_card PRIMARY KEY (board_id, card_id), 
    FOREIGN KEY(board_id) REFERENCES boards(id), 
    FOREIGN KEY(card_id) REFERENCES cards(id) 
); 

und einer folgenden JPA Entities:

@Entity 
@Table(name = "boards") 
public class Board extends BaseEntity implements Serializable { 

    @Id 
    @SequenceGenerator(name = "boards_id_seq", sequenceName = "boards_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "boards_id_seq") 
    private Long id; 


@Entity 
@Table(name = "cards") 
public class Card extends BaseEntity implements Serializable { 

    @Id 
    @SequenceGenerator(name = "cards_id_seq", sequenceName = "cards_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "cards_id_seq") 
    private Long id; 

    private String name; 

    private String description; 

Wie man richtig Zuordnungen organisieren, um der Lage sein, get boards_cards.on_hold für eine bestimmte Card, die Board über ManyToMany Beziehung über boards_cards Tabelle zugeordnet ist?

+1

chceck dies heraus http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/ – mariusz2108

+0

marginally verwandt, aber mit IDENTITY Sequenzgenerator funktioniert in pg und macht die Dinge einfacher –

+0

@ Niel-McGuigan Identität erlaubt keine Vorabzuweisung und hat andere Nachteile - wie macht es das Ding leichter? https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Identity_sequencing – Chris

Antwort

4

Dies ist nur eine relationale Tabelle mit zusätzlichen Spalten, und die Frage kommt häufig, so dass Sie in der Lage sein sollten, viele andere Antworten, Beispiele und Tutorials mit einer Suche zu finden.

Ich glaube, die beste Lösung ist jedoch, die Relationstabelle als eine Entität abzubilden, die Ihnen die vollständige Kontrolle über die Felder und Daten gibt. Sie können es dann zuordnen, wie auch immer Sie in Ihr Modell passen müssen, und sogar seine Existenz aus dem Modell verstecken, falls erforderlich. Zum Beispiel:

@Entity 
@Table(name = "boards_cards") 
public class Board_Card extends BaseEntity implements Serializable { 
    @Id 
    @ManyToOne 
    Board board; 
    @Id 
    @ManyToOne 
    Card card; 
    Boolean on_hold; 
} 

Dies kann dann in Ihrer Karte und Vorstand Entität referenziert wird, wie überhaupt benötigt wird. Eine Option könnte sein Card_Board Einheiten zu verstecken, und nur Karten Entitäten zurückgeben:

public class Board extends BaseEntity implements Serializable { 
    .. 
    @OneToMany(mappedby="board") 
    List<Card_Board> card_board_list; 
    @Transient 
    List<Card> cards; 

    public List<Card> getCards(){ 
    if (cards ==null) { 
     cards=new ArrayList(); 
     for (Card_Board cb: card_board_list) { 
     cards.add(cb.getCard()); 
     } 
    } 
    return cards; 
    } 

Sie können die Liste in zwei separate Listen brechen: eine on_hold Liste und eine aktive Liste.

Verwandte Themen