2016-01-20 83 views
1

我想在冬眠和春季做一個多對多的關係。下面休眠錯誤無效的列名

是我的產品類代碼如下

import java.io.Serializable; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name="Product") 
public class Product implements Serializable{ 

    @Id 
    @Column(name="productId") 
    @GeneratedValue 
    private Integer productId; 

    @Column(name="productName") 
    private String productName; 

    @Column(name="productPrice") 
    private int productPrice; 


    //---------------------------------------item mapped to category------------------------------------------// 
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
    @JoinTable(
      name="CategoryProduct", 
      joinColumns= @JoinColumn(name="productId") 
    ) 
    private Category category; 
    //--------------------------------------------------------------------------------------------------------// 



    public Integer getProductId() { 
     return productId; 
    } 

    public void setProductId(Integer productId) { 
     this.productId = productId; 
    } 

    public String getProductName() { 
     return productName; 
    } 

    public void setProductName(String productName) { 
     this.productName = productName; 
    } 

    public int getProductPrice() { 
     return productPrice; 
    } 

    public void setProductPrice(int productPrice) { 
     this.productPrice = productPrice; 
    } 

    public Category getCategory() { 
     return category; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 




} 

是我的類類

import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import java.io.Serializable; 
@Entity 
@Table(name="Category") 
public class Category implements Serializable{ 

    @Id 
    @Column(name="categoryId") 
    @GeneratedValue 
    private Integer categoryId; 

    @Column(name="categoryName") 
    private String categoryName; 

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    @JoinTable(
      name="CategoryProduct", 
      joinColumns = @JoinColumn(name="categoryId"), 
      inverseJoinColumns = @JoinColumn(name="productId") 
    ) 
    public Set<Product> product; 


    public Integer getCategoryId() { 
     return categoryId; 
    } 

    public void setCategoryId(Integer categoryId) { 
     this.categoryId = categoryId; 
    } 

    public String getCategoryName() { 
     return categoryName; 
    } 

    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 

    public Set<Product> getProduct() { 
     return product; 
    } 

    public void setProduct(Set<Product> product) { 
     this.product = product; 
    } 

} 

每當我運行的代碼我收到無效的列名稱代碼「category_categoryId」。我的表的

結構 產品具有 類別有作爲的categoryId,類別名稱列列的productId,poductName和productPrice categoryproducts具有的列的categoryId和的productId

回答

1

你忘了把inverseJoinColumns你@JoinTable在產品類別。這會導致hibernate使用它們的約定joinTable,它是<ClassName>_<columnName>。將其更改爲

@JoinTable(
    name="CategoryProduct", 
    joinColumns = @JoinColumn(name="productId"), 
    inverseJoinColumns = @JoinColumn(name="categoryId") 
) 
private Category category; 

但是,看看您的設計,實際上是在產品和類別之間創建了2個單向關聯。如果你想創建雙向關聯,我建議你換了一面(類別),使用的mappedBy

@OneToMany(mappedBy="category", cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
public Set<Product> product; 

它一般會達到同樣的效果。希望能幫助到你!

+0

謝謝,該解決方案爲我工作。由於我是Hibernate的一名新手,我會審查設計並考慮您的想法。 – user3509208