2011-10-09 32 views
5

Tôi có 3 bảng tbl_category, tbl_Advertisment và tbl_linkcategoryadvert (có nhiều để nhiều hiệp hội b/w loại & QUẢNG CÁO)org.hibernate.exception.SQLGrammarException: không thể khởi tạo một bộ sưu tập

My POJO như đưa ra dưới đây

Advertisment.java

@Entity 
@Table(name="tbl_advertisment") 
public class Advertisment implements Serializable { 
    private long id; 
    private String title; 
    private String message; 
    private Set<Category> categories; 

    public Advertisment(String title, String message) { 
     this.title = title; 
     this.message = message; 
     this.categories=new HashSet<Category>(); 
    } 

    protected Advertisment() { 
    } 

    @Id 
    @GeneratedValue 
    protected long getId() { 
     return id; 
    } 

    protected void setId(long id) { 
     this.id = id; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    @Column(nullable=false) 
    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    @ManyToMany(mappedBy="adverts") 
    public Set<Category> getCategories() { 
     return categories; 
    } 

    public void setCategories(Set<Category> categories) { 
     this.categories = categories; 
    } 
} 

Category.java

@Entity 
@Table(name="tbl_category") 
public class Category implements Serializable { 
    private long id; 
    private String title; 
    private Set<Advertisment> adverts=new HashSet<Advertisment>(); 

    public Category(String title) { 
     this.title = title; 
    } 

    protected Category() { 
    } 

    @ManyToMany 
    @JoinTable(name="tbl_linkcategoryadvert") 
    public Set<Advertisment> getAdverts() { 
     return adverts; 
    } 

    public void setAdverts(Set<Advertisment> adverts) { 
     this.adverts = adverts; 
    } 

    public void addAdvert(Advertisment advert){ 
     adverts.add(advert); 
    } 

    @Id 
    @GeneratedValue 
    protected long getId() { 
     return id; 
    } 

    protected void setId(long id) { 
     this.id = id; 
    } 

    @Column(unique=true,nullable=false) 
    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
} 

PostAdvert.java - lớp Main

public class PostAdvertisment extends DAO{ 

    public Advertisment post(String username,String catTitle,String title,String message) 
      throws DAOException { 
     try{ 
      begin(); 

      Query categoryQuery=getSession().createQuery("from Category where title=:categoryTitle"); 
      categoryQuery.setString("categoryTitle", catTitle); 
      Category category=(Category)categoryQuery.uniqueResult(); 

      Advertisment advert=new Advertisment(title,message,user); 
      getSession().save(advert); 

      category.addAdvert(advert);  
      getSession().save(category); 

      commit(); 

      return advert; 
     } catch(HibernateException he){ 
      he.printStackTrace(); 
      throw new DAOException(he.getMessage()); 
     }  
    } 

    public static void main(String[] args){ 

     String catTitle="LCD"; 
     String title="Bravia"; 
     String message="High Contrast Television"; 

     try{ 
      PostAdvertisment post=new PostAdvertisment(); 
      post.post(username, catTitle, title, message); 
      DAO.close(); 
     } catch(DAOException daoEx){ 
      System.out.println(daoEx.getMessage()); 
     } 
    } 
} 

DAO.java

tôi không cung cấp DAO.java vì nó chỉ chứa mã boilerplate Hibernate.

Khi tôi chạy lớp chính tôi nhận được sau ngoại lệ:

SEVERE: Unknown column 'adverts0_.categories_id' in 'field list' 
org.hibernate.exception.SQLGrammarException: could not initialize a collection: [hibernate.Category.adverts#3] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.loader.Loader.loadCollection(Loader.java:2001) 
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565) 
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60) 
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716) 
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344) 
    at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189) 
    at hibernate.Category.addAdvert(Category.java:48) 
    at hibernate.client.PostAdvertisment.post(PostAdvertisment.java:35) 
    at hibernate.client.PostAdvertisment.main(PostAdvertisment.java:56) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'adverts0_.categories_id' in 'field list' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
    at com.mysql.jdbc.Util.getInstance(Util.java:384) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) 

Xin vui lòng giúp tôi ra ....


Bàn của tôi trông giống như:

1. tbl_advert

id PK BIGINT 
title VARCHAR(255) 

2. tbl_category

id PK BIGINT 
title VARCHAR(255) 

3. tbl_linkcategoryadvert

advert_id FK references(advert.id) 
category_id FK references(category.id) 

Bây giờ câu hỏi của tôi là ...

  1. Am i dùng tên sai cho các trường trong bảng "link_categoryadvert "?
  2. cách hibernate tìm kiếm các tên cột & ánh xạ?
  3. các thuộc tính có thể có khác cho Chú thích @JoinTable là gì?
+1

làm các khóa ngoài trong bảng tham gia của bạn tbl_linkcategoryadvert có tên categories_id và advertisments_id? Nếu không, bạn có thể phải định cấu hình ánh xạ @JoinTable của mình để phản ánh các tên đó. –

+0

Bạn có thể nói là bảng quảng cáo trông như thế nào? Có lẽ bạn cần xác định cột nhiều thành phần, ví dụ: '@ JoinTable (name =" adverts ", joinColumns = @ JoinColumn (name =" cat_id "))'? –

+0

Vui lòng chỉ chỉnh sửa câu hỏi của bạn trong tương lai để cung cấp thêm chi tiết. Ngoài ra, hãy kiểm tra liên kết trợ giúp định dạng trong trình chỉnh sửa. –

Trả lời

0

Bạn muốn sử dụng chú thích @Jointable trên lớp sở hữu mối quan hệ. Bạn sẽ cần đặt các chú thích @Jointable vào lớp Advertisement.

2

Hibernate đang tạo tên cột "categories_id" cho cột kết nối của bạn, nơi bảng của bạn sử dụng tên "category_id". Hướng dẫn tham khảo có ví dụ về how to map a many-to-many relationship. Có một số chi tiết có liên quan trong văn bản xung quanh, là tốt. Bạn chỉ cần tạo bản đồ trên Danh mục của mình.getAdverts() trông giống như sau:

@JoinTable(
    name="tbl_linkcategoryadvert", 
    [email protected](name="category_id"), 
    [email protected](name="advert_id") 
) 
Các vấn đề liên quan