有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate一对多映射覆盖

在使用hibernate进行一对多映射时,我面临着一个hibernate问题。下面是我的两个实体类和联接表实体类。 ArticleCategoryMap。爪哇

    @Entity
    @Table(name = "ARTICLECATEGORYMAP")
    public class ArticleCategoryMap {
    private static final long serialVersionUID = -5653708523600543988L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column ( name = "id")
    Long id;


    @ManyToOne(targetEntity = Article.class, fetch = FetchType.EAGER, optional = true, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "ARTICLE_ID", nullable = true, insertable = true, updatable = true)
    private Article article;


    @ManyToOne(targetEntity = Category.class, fetch = FetchType.EAGER, optional = true, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "CATEGORY_ID", nullable = true, insertable = true, updatable = true)
    private Category category;

   //setter and getter  
}

文章。爪哇

    @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;
    }
   //setter and getter  
    }

类别。爪哇

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

    private long id;
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(
            name = "ARTICLECATEGORYMAP",
            joinColumns = @JoinColumn(name = "CATEGORY_ID"),
            inverseJoinColumns = @JoinColumn(name = "ARTICLE_ID")
    )
    @CollectionId(
            columns = @Column(name="id"), 
            type=@Type(type="long"), 
            generator = "sequence"
    )
    private Collection<Article> articles;



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

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(
            name = "ARTICLECATEGORYMAP",
            joinColumns = @JoinColumn(name = "CATEGORY_ID"),
            inverseJoinColumns = @JoinColumn(name = "ARTICLE_ID")
    )
    @CollectionId(
            columns = @Column(name="id"), 
            type=@Type(type="long"), 
            generator = "sequence"
    )
    // setter an getter
    }

现在假设我第一次在article表中有两个元素,它们映射到category表的一个条目。所以连接表看起来像 enter image description here

现在由于某种原因,我想更新条目,其中文章条目将映射到一个新的类别ID enter image description here

所以我的问题是如何更新这个连接表


共 (1) 个答案

  1. # 1 楼答案

    如果你想要一对多关系(一个类别有许多文章,一个类别有一个文章对一个类别),你不需要一个联接表

    实体类应该如下所示:

    类别实体:

    包含一组文章:

       @Entity
        @Table(name = "CATEGORY")
        public class Category {
    
        private long id;
        private String name;
    
        @OneToMany(mappedBy="category")
            private Set<Article> articles;
    
              ......
        }
    

    文章实体:

        @Entity
        @Table(name = "ARTICLE")
        public class Article {
    
        @ManyToOne
        @JoinColumn(name="id", nullable=false)
        private Category category;
    
        private long id;
        private String title;
        private String description;
        private String keywords;
        private String content;
    
        .......
        }
    

    有关更多详细信息,请查看hibernate-one-to-many。希望这有帮助

    还可以将注释从方法移动到字段。这是:

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

    应该是:

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

    多对多关系:

    在数据库中有3个表:

    1. CATEGORY
    2. ARTICLE
    3. ARTICLECATEGORYMAP (join table)

    对于多对多关系实体而言:

    类别实体:

        @Entity
            @Table(name = "CATEGORY")
            public class Category {
    
            @Id
            @GeneratedValue
            @Column(name = "CATEGORY_ID")
            private long id;
            private String name;
    
           @ManyToMany(cascade = { CascadeType.ALL })
           @JoinTable(
            name = "ARTICLECATEGORYMAP", 
            joinColumns = { @JoinColumn(name = "CATEGORY_ID") }, 
            inverseJoinColumns = { @JoinColumn(name = "ARTICLE_ID") }
        )
        Set<Article > articles = new HashSet<>();
         .....
       }
    

    文章实体:

        @Entity
        @Table(name = "ARTICLE")
        public class Article {
    
    
        @Id
        @GeneratedValue
        @Column(name = "ARTICLE_ID") 
        private long id;
        private String title;
        private String description;
        private String keywords;
        private String content;
    
        @ManyToMany(mappedBy = "articles")
        private Set<Category> categories = new HashSet<>();
    
        .......
        }
    

    有关更多信息,请查看many-to-many ralationship