Java 将一个映射到多个,无重复项
我试图在Jpa Spring Jpa(Hibernate)中实现我认为是“一对多”的关系,其中我有三个表(Post、Tag、Post_Tag) 一篇文章可能有许多标签,而多篇文章可能与其他标签共享同一标签。如果标记重叠,则标记表中应该只有该标记的一个实例 结构有点类似于以下内容: 职位:Java 将一个映射到多个,无重复项,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我试图在Jpa Spring Jpa(Hibernate)中实现我认为是“一对多”的关系,其中我有三个表(Post、Tag、Post_Tag) 一篇文章可能有许多标签,而多篇文章可能与其他标签共享同一标签。如果标记重叠,则标记表中应该只有该标记的一个实例 结构有点类似于以下内容: 职位: 身份证 名字 邮政标签: 邮政编码 标签号 标签: 身份证 标签 我的理解是,从帖子的角度来看,这是一种“多对一”关系,从标签的角度来看,这是一种“一对多”关系。目前,我已经设法使用多对一关系来实现
- 身份证
- 名字
- 邮政编码
- 标签号
- 身份证
- 标签
@Table(name="Post")
public class Post implements Serializable {
...
@ManyToOne(targetEntity = Tags.class, cascade = {CascadeType.ALL, CascadeType.MERGE})
@JoinTable(name = "post_tags",
joinColumns = {@JoinColumn(name = "post_id")},
inverseJoinColumns = {@JoinColumn(name = "tag_id", unique=true)})
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="post_tags")
public Set<Tags> tags;
谢谢 你的婚姻实际上是一种多对多的关系。你最好用
@manytomy
。像下面这样
@Entity
@Table(name = "Tag")
public class Tag{
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "Post_Tag",
joinColumns = { @JoinColumn(name = "tag_id") },
inverseJoinColumns = { @JoinColumn(name = "post_id") }
)
Set<Post> posts = new HashSet<>();
// standard constructor/getters/setters
}
@Entity
@Table(name = "Post")
public class Post{
@ManyToMany(mappedBy = "posts")
private Set<Tag> tags= new HashSet<>();
// standard constructors/getters/setters
}
@实体
@表(name=“Tag”)
公共类标记{
@ManyToMany(cascade={CascadeType.ALL})
@可接合(
name=“Post_标签”,
joinColumns={@JoinColumn(name=“tag_id”)},
inverseJoinColumns={@JoinColumn(name=“post_id”)}
)
Set posts=newhashset();
//标准构造函数/getter/setter
}
@实体
@表(name=“Post”)
公共类职位{
@许多(mappedBy=“posts”)
private Set tags=new HashSet();
//标准构造函数/getter/setter
}
您的scnerio实际上是一种多对多关系。你最好用
@manytomy
。像下面这样
@Entity
@Table(name = "Tag")
public class Tag{
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "Post_Tag",
joinColumns = { @JoinColumn(name = "tag_id") },
inverseJoinColumns = { @JoinColumn(name = "post_id") }
)
Set<Post> posts = new HashSet<>();
// standard constructor/getters/setters
}
@Entity
@Table(name = "Post")
public class Post{
@ManyToMany(mappedBy = "posts")
private Set<Tag> tags= new HashSet<>();
// standard constructors/getters/setters
}
@实体
@表(name=“Tag”)
公共类标记{
@ManyToMany(cascade={CascadeType.ALL})
@可接合(
name=“Post_标签”,
joinColumns={@JoinColumn(name=“tag_id”)},
inverseJoinColumns={@JoinColumn(name=“post_id”)}
)
Set posts=newhashset();
//标准构造函数/getter/setter
}
@实体
@表(name=“Post”)
公共类职位{
@许多(mappedBy=“posts”)
private Set tags=new HashSet();
//标准构造函数/getter/setter
}
问题是您的帖子引用了您的标签表。您的贴子应参考您的贴子标签表以获取标签:
@Entity
@Table(name = "post")
public class Post implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "post")
private String post;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "postId")
private List<PostTag> postTagList;
}
@Entity
@Table(name = "tag")
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "tag")
private String tag;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tagId")
private List<PostTag> postTagList;
}
@Entity
@Table(name = "post_tag")
public class PostTag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@JoinColumn(name = "post_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Post postId;
@JoinColumn(name = "tag_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Tag tagId;
}
需要注意的一点是,默认情况下hibernate会延迟抓取,因此列表可能会出错。您必须编写查询,以便从存储库中快速获取数据,或者以何种方式获取数据问题在于您的帖子引用了标记表。您的贴子应参考您的贴子标签表以获取标签:
@Entity
@Table(name = "post")
public class Post implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "post")
private String post;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "postId")
private List<PostTag> postTagList;
}
@Entity
@Table(name = "tag")
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "tag")
private String tag;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tagId")
private List<PostTag> postTagList;
}
@Entity
@Table(name = "post_tag")
public class PostTag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@JoinColumn(name = "post_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Post postId;
@JoinColumn(name = "tag_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Tag tagId;
}
需要注意的一点是,默认情况下hibernate会延迟抓取,因此列表可能会出错。您必须编写查询,以便从存储库中快速获取数据,或者以何种方式获取数据这是一个多对多映射集字段怎么可能是
@ManyToOne
???它不能。这是一个多对多映射。一个集合字段怎么可能是一个@manytone
???不可能。