gpt4 book ai didi

mysql - 多对多创建 2 个表

转载 作者:行者123 更新时间:2023-11-29 11:41:44 25 4
gpt4 key购买 nike

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

 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 方法上。

一种方法是仅在现场级别使用。如果是在字段注解,则改为如下(其他实体类也需要修改):

@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 移至字段。或者您必须进行更改,以便所有注释都位于 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

关于mysql - 多对多创建 2 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com