2011-10-09 120 views
5

我有3个表tbl_category,tbl_Advertisment和tbl_linkcategoryadvert(具有多对多关联的B/W类&广告)org.hibernate.exception.SQLGrammarException:无法初始化集合

我POJO的下面

给出

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 - 主类

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

我不提供DAO.java,因为它仅包含Hibernate的样板代码。

当我运行主类,我得到以下异常:

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) 

请帮我....


我的表看起来为:

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) 

现在我的问题是...

  1. 难道我错取的名字为表中的字段“link_categoryadvert “?
  2. hibernate如何查找列名&映射?
  3. @JoinTable注解的其他可能属性是什么?
+1

在连接表中执行外键tbl_linkcategoryadvert是否有名称categories_id和advertisments_id?否则,您可能必须配置您的@JoinTable映射以反映这些名称。 –

+0

你能告诉我们广告表是怎么样的吗?也许你需要定义多对多的列,例如'@JoinTable(name =“adverts”,joinColumns = @ JoinColumn(name =“cat_id”))'? –

+0

请稍后编辑您的问题以提供更多详细信息。另外,请查看编辑器中的格式帮助链接。 –

回答

0

您想在拥有关系的类上使用@Jointable注释。您需要在Advertisement类上放置@Jointable注释。

2

Hibernate正在为您的连接列生成列名“categories_id”,其中您的表使用名称“category_id”。参考指南的例子是how to map a many-to-many relationship。周围文本中还有几个相关的细节。你应该只需要在你的类别上进行映射。getAdverts()看起来像这样:

@JoinTable(
    name="tbl_linkcategoryadvert", 
    [email protected](name="category_id"), 
    [email protected](name="advert_id") 
) 
相关问题