[英]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個表:
- 類別
- 文章
- 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.