2011-10-09 28 views
5

コレクションを初期化できませんでした(多くの団体に多くを持つB /カテゴリ&アドバタイズメントワット)org.hibernate.exception.SQLGrammarException:私は3つのテーブルtbl_category、tbl_Advertismentとtbl_linkcategoryadvertを持って

私の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

それが唯一のHibernateの定型的なコードが含まれているように私はDAO.javaを提供していませんよ。

私はメインクラスを実行すると、私は例外を以下の取得:

1. tbl_advert:

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) 


私の表のようにのように見える....私を助けてください。

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 Annotationには他にどのような属性がありますか?
+1

joinテーブルの外部キーを行うtbl_linkcategoryadvertはcategories_idとadvertisments_idという名前を持っていますか?それ以外の場合は、それらの名前を反映するように@JoinTableマッピングを設定する必要があります。 –

+0

'adverts'テーブルの見た目は分かりますか?おそらく、多対多列を定義する必要があります。 '@JoinTable(name =" adverts "、joinColumns = @ JoinColumn(name =" cat_id "))'? –

+0

今後さらに詳細を提供するために質問を編集してください。また、エディタで書式設定ヘルプのリンクを確認してください。 –

答えて

0

リレーションシップを所有するクラスで@Jointableアノテーションを使用したいとします。 @JointableアノテーションをAdvertisementクラスに配置する必要があります。

2

Hibernateは、あなたのテーブルが "category_id"という名前を使用するあなたの結合カラムのためのカラム名 "categories_id"を生成しています。リファレンスガイドの例はhow to map a many-to-many relationshipです。周囲のテキストにも関連する詳細がいくつかあります。あなたはあなたのカテゴリーのマッピングをする必要があります。

@JoinTable(
    name="tbl_linkcategoryadvert", 
    [email protected](name="category_id"), 
    [email protected](name="advert_id") 
) 
関連する問題