我为 JSF 项目设计了 Category、SubCategory 和 Product 实体,但在 SubCategory 和具有多对多关系的 Product 之间的映射方面遇到了问题。下面是类别、子类别和产品。我怎样才能解决这个映射异常。谢谢。
@Entity
@Table(name="CATEGORY",schema="DEMO")
public class Category implements Serializable{
@Id
@SequenceGenerator(name="catseq",sequenceName="seqCatSEQ",allocationSize=1)
@GeneratedValue(generator="catseq",strategy=GenerationType.SEQUENCE)
@Column(name="ID")
private Integer id;
@Column(name="NAME")
private String name;
@Column(name="CAT_DESC")
private String catDesc;
@OneToMany(cascade = { CascadeType.PERSIST },mappedBy="category")
private Set<SubCategory> subcategories = new HashSet();
public Category() {
super();
// TODO Auto-generated constructor stub
}
public Category(String name, String catDesc) {
super();
this.name = name;
this.catDesc = catDesc;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCatDesc() {
return catDesc;
}
public void setCatDesc(String catDesc) {
this.catDesc = catDesc;
}
public Set<SubCategory> getSubcategories() {
return subcategories;
}
public void setSubcategories(Set<SubCategory> subcategories) {
this.subcategories = subcategories;
}
}
子类别:
package entities;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="SUBCATEGORY",schema="DEMO")
public class SubCategory implements Serializable{
@Id
@SequenceGenerator(name="subcatseq",sequenceName="seqSubCatSEQ",allocationSize=1)
@GeneratedValue(generator="subcatseq",strategy=GenerationType.SEQUENCE)
@Column(name="ID")
private Integer id;
@Column(name="SUBNAME")
private String SubName;
@Column(name="SUBNAME_DESC")
private String SubNameDes;
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@JoinColumn(name = "CAT_ID")
private Category category;
@ManyToMany(cascade=CascadeType.PERSIST,mappedBy="subcategories")
Set<Product> products = new HashSet<Product>();
public SubCategory() {
super();
// TODO Auto-generated constructor stub
}
public SubCategory(String subName, String subNameDes) {
super();
SubName = subName;
SubNameDes = subNameDes;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSubName() {
return SubName;
}
public void setSubName(String subName) {
SubName = subName;
}
public String getSubNameDes() {
return SubNameDes;
}
public void setSubNameDes(String subNameDes) {
SubNameDes = subNameDes;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
产品:
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="PRODUCTS",schema="DEMO")
public class Product implements Serializable{
@Id
@SequenceGenerator(name="proseq",sequenceName="proSEQ",allocationSize=1)
@GeneratedValue(generator="proseq",strategy=GenerationType.SEQUENCE)
@Column(name="ID")
private Integer id;
@Column(name="NAME")
private String productName;
@Column(name="QUANTITY")
private Integer quantity;
@Column(name="PRICE")
private Double price;
@Column(name="PRODUCT_DESC")
private String productDes;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="PRODUCT_SUBCATEGORY",
joinColumns={@JoinColumn(name="PRODUCT_ID")},
inverseJoinColumns={@JoinColumn(name="SUBCATEGORY_ID")}
)
Set<SubCategory> subcategories = new HashSet<SubCategory>();
public Product() {
super();
// TODO Auto-generated constructor stub
}
public Product(String productName, Integer quantity, Double price, String productDes,
Set<SubCategory> subcategories) {
super();
this.productName = productName;
this.quantity = quantity;
this.price = price;
this.productDes = productDes;
this.subcategories = subcategories;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getProductDes() {
return productDes;
}
public void setProductDes(String productDes) {
this.productDes = productDes;
}
public Set<SubCategory> getSubcategories() {
return subcategories;
}
public void setSubcategories(Set<SubCategory> subcategories) {
this.subcategories = subcategories;
}
}
最佳答案
首先mappedby
定义为它指的是拥有关系的字段,通过其他含义mapped by指的是具有外键的表类
所以我们有两个可疑的 mappedBy
让我们一一分析:
1-
@OneToMany(cascade = { CascadeType.PERSIST },mappedBy="category")
private Set<SubCategory> subcategories = new HashSet();
这意味着 subcategory
表和类拥有关系字段,所以 subcategory
表是具有外键的表和 SubCategory
类外键名称是 CAT_ID
所以这个没问题。
2-
@ManyToMany(cascade=CascadeType.PERSIST,mappedBy="subcategories")
Set<Product> products = new HashSet<Product>();
好的,这表明在 Product
类中有一个名为 subcategories
的字段,该类拥有关系 BAM 这是不正确的,因为这是 ManyToMany
关系的所有者应该是数据库中存在的第三个表,并且必须由 hibernate 在逻辑上理解
所以这就是问题 mappedBy
指的是不是关系所有者的字段,因为所有者是某个匿名实体
这必须是这样的:
@ManyToMany(cascade=CascadeType.PERSIST)
@JoinTable(name="PRODUCT_SUBCATEGORY",
joinColumns={@JoinColumn(name="SUBCATEGORY_ID")},
inverseJoinColumns={@JoinColumn(name="PRODUCT_ID")}
Set<Product> products = new HashSet<Product>();
- 请注意您的
PRODUCT_SUBCATEGORY
表应该只有两个主键并且应该是主键,以便 hibernate 理解这是ManyToMany
关系
关于java - 使用 @OneToMany 或 @ManyToMany 定位未映射的类(Category、SubCategory、Product),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997108/