Java @OneToMany@JoinTable使用三个表

Java @OneToMany@JoinTable使用三个表,java,hibernate,jpa,spring-data-jpa,persistent,Java,Hibernate,Jpa,Spring Data Jpa,Persistent,我在hibernate中遇到了一个场景,我试图寻找这样的场景讨论,但我无法在这里获得任何建议或帮助 我有三张桌子分类,分类,分类 CREATE TABLE `category` ( `category_id` int(11) NOT NULL AUTO_INCREMENT, `category_name` varchar(45) NOT NULL, `category_description` varchar(45) NOT NULL, PRIMARY KEY (`categor

我在hibernate中遇到了一个场景,我试图寻找这样的场景讨论,但我无法在这里获得任何建议或帮助

我有三张桌子分类,分类,分类

CREATE TABLE `category` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_name` varchar(45) NOT NULL,
  `category_description` varchar(45) NOT NULL,
  PRIMARY KEY (`category_id`)
);


CREATE TABLE `article` (
  `article_id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(70) NOT NULL,
  `description` varchar(250) NOT NULL,
  `keywords` varchar(150) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`article_id`)
);

CREATE TABLE `category_article` (
  `category_id` int(11) NOT NULL,
  `article_id` int(11) NOT NULL,
  'category_article_status' varchar(1) NOT NULL.
  'category_article_type' varchar(2) NOT NULL,
  PRIMARY KEY (`category_id`,`article_id`),
  UNIQUE KEY `article_id_UNIQUE` (`article_id`),
  KEY `fk_category` (`category_id`),
  KEY `fk_article` (`article_id`),
  CONSTRAINT `fk_article` FOREIGN KEY (`article_id`) REFERENCES `article` (`article_id`),
  CONSTRAINT `fk_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`)
);
我有一个分类实体

    @Entity
    @Table(name = "CATEGORY")
    public class Category {

        private long id;
        private String name;

    @Id
    @GeneratedValue
    @Column(name = "CATEGORY_ID")
    public long getId() {
        return id;
    }

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "CATEGORY_ARTICLE",`enter code here`
            joinColumns = @JoinColumn(name = "CATEGORY_ID"),
            inverseJoinColumns = @JoinColumn(name = "ARTICLE_ID")
    )
    private Set<Article> articles; 
    // other getters and setters...

/*For Article entity is */
    @Entity
    @Table(name = "ARTICLE")
    public class Article {
        private long id;
        private String title;
        private String description;
        private String keywords;
        private String content;

    @Id
    @GeneratedValue
    @Column(name = "ARTICLE_ID")
    public long getId() {
        return id;
    }

    // other getters and setters...
@实体
@表(name=“CATEGORY”)
公共类类别{
私人长id;
私有字符串名称;
@身份证
@生成值
@列(name=“CATEGORY\u ID”)
公共长getId(){
返回id;
}
@OneToMany(级联=级联类型.ALL)
@可接合(
name=“CATEGORY\u ARTICLE”,`在此处输入代码`
joinColumns=@JoinColumn(name=“CATEGORY\u ID”),
inverseJoinColumns=@JoinColumn(name=“ARTICLE\u ID”)
)
私人物品;
//其他的能手和二传手。。。
/*对于文章实体是*/
@实体
@表(name=“ARTICLE”)
公共类文章{
私人长id;
私有字符串标题;
私有字符串描述;
私有字符串关键字;
私有字符串内容;
@身份证
@生成值
@列(name=“ARTICLE\u ID”)
公共长getId(){
返回id;
}
//其他的能手和二传手。。。
对于category_文章,我没有实体,因为我在category中使用@jointable 所以一切都很好,直到我在category_文章中只有两列,即category_id和article_id。但是,当我又添加了两列时,我就不知道如何在那些不为空的coulmns(category_article_status和category_article_type)中插入数据


对此有何建议。

您应该像这样为
类别文章创建另一个实体

@Entity
@Table(name = "CATEGORY_ARTICLE")
public class CategoryArticle{

   @Id
   private Long id;

   @ManyToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "category_id")  
   private Category category;

   @ManyToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "article_id")  
   private Article article; 


   // other columns 
   private Boolean categoryArticleStatus;

   private Long categoryArticleType;

}
并且还应该更改
类别
文章
。从类别实体中删除
可连接的
,并将其更改为以下内容

类别

@Entity
@Table(name = "CATEGORY")
public class Category {

  //.....

  @OneToMany(mappedBy = "category")
  private Set<CategoryArticle> categoryArticleSet;
}
@实体
@表(name=“CATEGORY”)
公共类类别{
//.....
@OneToMany(mappedBy=“类别”)
私有集categoryArticleSet;
}
文章

@Entity
@Table(name = "ARTICLE")
public class Article {

  //.....

  @OneToMany(mappedBy = "article")
  private Set<CategoryArticle> categoryArticleSet;

 }
@实体
@表(name=“ARTICLE”)
公共类文章{
//.....
@OneToMany(mappedBy=“article”)
私有集categoryArticleSet;
}

那么我应该删除category entity中的@jointable吗?category entity类中有任何更改吗?好吧,那么你是说我不能使用@OneToMany(cascade=CascadeType.ALL)@jointable(name=“category\u ARTICLE”,JointColumns=@JointColumn(name=“category\u ID”),inverseJoinColumns=@JoinColumn(name=“ARTICLE_ID”)是的,您应该在
CategoryArticle
实体中定义两个
oneToMany
关系。让我来做这些更改,看看它是如何工作的。除了这些新列,现在还需要做很多更改。而em.persist()我需要只传递Category对象还是同时传递Category和Article。因为我必须先在Category中插入数据,然后再在Category_文章中插入数据。从请求中,我将获得Category的所有couln详细信息以及Article_id。请告诉我们Java模型中的其他两个字段在哪里?因为JPA只保留类中的内容,所以你的类中没有它们。它们是CATEGORY_ARTICLE table中的新字段,因此我必须找到一种方法来为这些新列插入数据。我上面提到的旧实现。这就是我的问题。如何在这些列中插入数据,因为旧实现直接执行JoinTable并插入CATEGORY_id和ARTICLE_i我认为这将改变当前的实现。一个“列”(在一个表中)不是一个字段(在一个类中)。正如我所说的……它们不在你的类中。所以把它们放在你的类中,你就可以看到它们是如何映射到表的。如果它们不在Java类中,那么读/写这些列的唯一方法就是使用“魔法”。有很多M-N的例子"例如,Billy,我完全理解你的观点,我同意,让我给你更详细的解释。因此,文章表是一个主表,不应该删除其中的任何记录。CATEGORY_Article是一个逻辑表,它将类别与文章绑定。因此,如果你删除CATEGORY_Article中的任何条目,它应该删除e Category表中的primarry记录也是,但不是来自文章。下面没有删除功能,现在它们在Category_文章中又包含了两列。因此,我当前的设计如上所示。当你说添加到java时,我无法添加到ARTICLE.java和Category。java@billy我必须改变当前的设计,我必须移除e从类别中jointable并做一些类似hadi所说的事情。因此我正在研究映射这两列的解决方案,并找到一种先从类别文章中删除记录,然后再从类别中删除记录的方法,但仍然不涉及文章表记录,因为它们不应该被删除。现在我有一个解决方案,正如hadi所提到的,但在这种情况下它也会在文章表中保留recirds,当你们删除它时,它会从文章表中删除,这是很难做到的。所以我期待着嵌入式遗嘱来解决我的问题。