2016-01-20 47 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