java - 使用 @OneToMany 或 @ManyToMany 定位未映射的类(Category、SubCategory、Product)

标签 java jpa

我为 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/

相关文章:

java - 无法解析方法 'get(java.lang.String)'

java - 将数据集中的映射类型映射到列

Java vector 数据分组-相关代码

java - 即使提供转换类后也出现 ClassCastException

java - 在 Spring Boot 中设置隔离级别

java - 如何防止 eclipse-link 在 DTO 映射期间获取延迟加载的属性?

java - 找不到方法但找到了另一个方法

javax.mail.internet.InternetAddress RFC 822 验证

java - 清空对已删除实体的所有引用

java - 如何使我的 sql 数据可用于 Junit 中的所有新事务?