2016-01-20 3 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; 
    } 

} 

Всякий раз, когда я запускаю код я получаю Invalid имя столбца «category_categoryId».

Структура моих таблиц Продукт имеет столбец как ProductID, poductName и productPrice категория имеет столбцы как CategoryId, CategoryName 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 однонаправленной связь между продуктом и категорией. Если вы хотите создать двунаправленную связь, я предлагаю вам изменить одну сторону (Category), чтобы использовать mappedBy

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

Это, как правило, добиться того же результата. Надеюсь, поможет!

+0

Спасибо, решение сработало для меня. Поскольку я довольно новичок в Hibernate, я рассмотрю дизайн и рассмотрю вашу идею. – user3509208

Смежные вопросы