Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一个映射到多个,无重复项_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

Java 将一个映射到多个,无重复项

Java 将一个映射到多个,无重复项,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我试图在Jpa Spring Jpa(Hibernate)中实现我认为是“一对多”的关系,其中我有三个表(Post、Tag、Post_Tag) 一篇文章可能有许多标签,而多篇文章可能与其他标签共享同一标签。如果标记重叠,则标记表中应该只有该标记的一个实例 结构有点类似于以下内容: 职位: 身份证 名字 邮政标签: 邮政编码 标签号 标签: 身份证 标签 我的理解是,从帖子的角度来看,这是一种“多对一”关系,从标签的角度来看,这是一种“一对多”关系。目前,我已经设法使用多对一关系来实现

我试图在Jpa Spring Jpa(Hibernate)中实现我认为是“一对多”的关系,其中我有三个表(Post、Tag、Post_Tag)

一篇文章可能有许多标签,而多篇文章可能与其他标签共享同一标签。如果标记重叠,则标记表中应该只有该标记的一个实例

结构有点类似于以下内容:

职位:

  • 身份证
  • 名字
邮政标签:

  • 邮政编码
  • 标签号
标签:

  • 身份证
  • 标签
我的理解是,从帖子的角度来看,这是一种“多对一”关系,从标签的角度来看,这是一种“一对多”关系。目前,我已经设法使用多对一关系来实现这一点,但是这会产生许多具有不同ID的相同标记,并使数据库变得混乱,从而使其速度变慢,并使我在redis中缓存结果,这是一种尝试,以加速查询,这是一个临时修复

我目前拥有的是:

@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
???不可能。