【发布时间】:2017-11-27 07:18:08
【问题描述】:
在使用休眠的一对多映射中更新连接表时,我遇到了休眠问题。下面是我的两个实体类和连接表实体类。 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 的条目。所以最终的数据库应该看起来像
所以我的问题是如何更新这个连接表。
【问题讨论】:
-
所以基本上你有一个
ManyToMany关系而不是OneToMany。否则你就不需要 Join-Table -
您的映射错误。阅读休眠手册。它对每个集合映射都有示例和解释。您不应该在类别中有 Collection
。您应该有一个 Collection ,并带有 @OneToMany(mappedBy = "category")注释。或者您可以完全放弃 ArticleCategoryMap 实体,并在 Article 和 Category 之间使用 ManyToMany。
标签: java postgresql hibernate