2016-02-28 63 views
0

我有兩個類卡和標籤。我想要它們之間的多對多關係,並將cardId和tagId存儲在一張表中。當我從代碼創建數據庫時,它會創建2個不同的表格,並且具有一對多的關係。 tag_cards和card_tags。我在這裏做錯了什麼?我想要一張桌子,有很多關係。ManytoMany創建2個表

import javax.faces.bean.ManagedBean; 
    import javax.persistence.*; 
import java.util.Set; 


    @ManagedBean(name = "addToCardBean") 
@javax.persistence.Table(name = "cards") 
@Entity 
public class Card implements java.io.Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int id; 

@Column(name="username",nullable = false) 
private String username; 
@Column(name="text",nullable = false) 
private String text; 
@Column(name="author") 
private String author; 
@Column(name="title") 
private String title; 
@Column (name="source") 
private String source; 
@Column(name="facebookID" ,columnDefinition="BigInt(20) default '0'") 
private long facebookID; 
@ElementCollection(targetClass = Tag.class) 
private Set<Tag> tags; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getSource() { 
    return source; 
} 

public void setSource(String source) { 
    this.source = source; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public String getAuthor() { 
    return author; 
} 

public void setAuthor(String author) { 
    this.author = author; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public long getFacebookID() { 
    return facebookID; 
} 

public void setFacebookID(long facebookID) { 
    this.facebookID = facebookID; 
} 

@ManyToMany(mappedBy = "cards") 
public Set<Tag> getTags() { 
    return tags; 
} 

public void setTags(Set<Tag> tags) { 
    this.tags = tags; 
} 
} 

import javax.faces.bean.ManagedBean; 
import javax.persistence.*; 
import java.util.Set; 


@Entity 
@Table(name="tag") 
@ManagedBean(name="tagBean") 
public class Tag implements java.io.Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public Integer id; 

@Column(name = "tagName", nullable = false) 
private String tagName; 
@ElementCollection(targetClass = Card.class) 
private Set<Card> cards; 
public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getTagName() { 
    return tagName; 
} 

public void setTagName(String tagName) { 
    this.tagName = tagName; 
} 


@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(
     name = "cards_tags", 
     joinColumns = @JoinColumn(name = "id"), 
     inverseJoinColumns = @JoinColumn(name = "id") 
) 
public Set<Card> getCards() { 
    return cards; 
} 

public void setCards(Set<Card> cards) { 
    this.cards = cards; 
} 
} 

回答

1

你正面臨這個問題,因爲你已經在雙方即你已經混在外地和方法(吸氣)級使用的註解。

@Column(name = "tagName", nullable = false) 
private String tagName; 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(
    name = "cards_tags", 
    joinColumns = @JoinColumn(name = "id"), 
    inverseJoinColumns = @JoinColumn(name = "id") 
) 
public Set<Card> getCards() { 
    return cards; 
} 

你必須要麼使用它們只在現場或只在方法(吸氣)。不要混淆兩者。

爲什麼你最後得到兩個表是因爲字段註釋得到考慮,許多映射是在getter方法,這是沒有被考慮。

一種方法就是在現場級使用。如果在現場註釋,請更改爲以下內容(您還需要修改其他實體類):

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(
    name = "cards_tags", 
    joinColumns = @JoinColumn(name = "id"), 
    inverseJoinColumns = @JoinColumn(name = "id") 
) 
@ElementCollection(targetClass = Card.class) 
private Set<Card> cards; 

您需要在兩個類中進行更改。如上所述,將註釋從getter移至field。或者您必須進行更改,以便所有註釋都位於getter而不是field。

其他鏈接: https://softwareengineering.stackexchange.com/questions/258541/where-to-put-jpa-annotations-field-or-getter

the difference between anotating a field and its getter method JPA

+0

不工作我得到由導致錯誤:org.hibernate.MappingException:在映射重複列集合:com.websystique.springmvc.model.Tag。 cards列:id – mert

+0

更改了id的列名,現在就完成了。謝謝! – mert