ManytoMany 创建 2 个表

ManytoMany creating 2 tables

我有两张 类 卡片和标签。我想要它们之间的多对多关系,并将 cardId 和 tagId 存储在一个 table 中。当我从代码创建数据库时,它会创建 2 个具有一对多关系的不同 table。 tag_cards 和 card_tags。我在这里做错了什么?我想要一个具有多对多关系的单身 table。

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

您遇到此问题是因为您在字段和方法 (getter) 级别都使用了注释,即您混合了两者。

@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)。不要混淆两者。

为什么你最终得到两个表是因为正在考虑字段注释并且多对多映射在 getter 方法上,但没有被考虑考虑过。

一种方法是在现场级别使用。如果在字段上注释,改为如下(你还需要修改其他实体class):

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

您需要在两个 class 中进行更改。如上所述将注释从 getter 移动到字段。或者您必须进行更改,以便所有注释都在 getter 而不是字段上。

附加链接: 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