2016-04-28 80 views
1

我有一個未來三個表(PostgreSQL的):JPA多對多映射與附加字段

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) 
); 

及以下JPA的entites:

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

如何正確組織映射,以便能夠得到boards_cards.on_holdCard,通過ManyToMany映射到Board關係在boards_cards表上?

+1

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

+0

勉強相關,但使用IDENTITY序列生成器工作在PG和使事情更容易 –

+0

@ Niel-McGuigan身份不允許預先分配和其他退後 - 它是如何使事情變得更容易? https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Identity_sequencing – Chris

回答

4

這只是一個帶有額外列的關係表,而且這個問題經常出現,所以您應該能夠通過搜索找到許多其他答案,示例和教程。

我相信最好的解決方案是將關係表映射爲實體,讓您完全控制字段和數據。然後,您可以將它映射到需要適合模型的地方,甚至可以根據需要將其存在於模型中。例如:

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

然後這可以在您的卡和董事會實體如何需要引用。一種選擇可能是隱藏Card_Board實體,只退卡實體:

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

您可將列表分爲兩個獨立的清單:一個ON_HOLD狀態列表和活動列表。