2016-08-17 58 views
2

我設計類別,子類別和產品實體JSF項目,我有大約子類別和產品與多對多關係之間的映射的問題。以下是類別,子類別和產品。我怎樣才能解決這個映射excepiton。 THKS。使用@OneToMany或@ManyToMany針對未映射類(類別,子類別,產品)

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


} 
+0

是你的'組件-scan'設置爲正確的包裹?複製代碼中是否缺少包聲明,或者是不同包中的實體? – Jens

+0

對於多對多的關係,我想消除在'@ ManyToMany'註釋'CascadeType' setttings。 1.堅持子類別,2.堅持產品。 3.設置子類別和產品,並同步會話變化之間的關係到數據庫(如果這一步都沒有在1和2相同的會議,你可以有手動合併子類別和產品的狀態) – Hantsy

回答

1

首先mappedby被定義爲它指的是誰擁有的關係,通過由映射別的意思現場指表類其中有外鍵

所以我們有兩個mappedBy是suspiecous讓我們逐一:

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

確定這一個表明,有一個被稱爲場中subcategoriesProduct這一個擁有關係BAM,因爲這是ManyToMany關係的所有者應該是這是不正確的在數據庫上存在第三個表,並且必須通過休眠來邏輯理解

所以這是問題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表只能有兩個主鍵,應該是主要的,使休眠明白,這是ManyToMany關係
相關問題