簡體   English   中英

休眠一對多映射覆蓋

[英]Hibernate One to many mapping override

我在使用冬眠一對多映射更新連接表時遇到了冬眠問題。 下面是我的兩個實體類和聯接表實體類。 ArticleCategoryMap.java

    @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  
}

Article.java

    @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  
    }

Category.java

  @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
    }

現在,假設我第一次在商品表中有2個元素,它們映射到類別表的一個條目。 所以聯接表看起來像 在此處輸入圖片說明

現在由於某種原因,我想更新條目,文章條目將映射到新的類別ID。 所以最終的DB應該看起來像 在此處輸入圖片說明

所以我的問題是如何更新此聯接表。

如果您想要一對多關系(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;

    .......
    }

有關更多詳細信息,請參閱休眠一對多 希望這可以幫助。

還將注釋從方法移動到字段。 這個:

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. 類別
  2. 文章
  3. ARTICLECATEGORYMAP(聯接表)

對於多對多關系實體,將是:

類別實體:

    @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<>();

    .......
    }

欲了解更多信息,請看多對多關系

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM