2011-10-09 34 views
5

mam 3 tabele tbl_category, tbl_Advertisment i tbl_linkcategoryadvert (mający wiele do wielu stowarzyszenia b/w kategorii & advertisment)org.hibernate.exception.SQLGrammarException: nie można zainicjować kolekcji

My POJO na podane poniżej

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 - Główna klasa

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

Ja nie zapewniając DAO.java gdyż zawiera tylko hibernacji kod szablonowe.

Kiedy uruchomić główne klasy I uzyskać następujący wyjątek:

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) 

Proszę mi pomóc ....


moim tabel wygląda tak:

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) 

Teraz moje pytania są ...

  1. Am I podejmowania niewłaściwych nazw pól w tabeli „link_categoryadvert "?
  2. jak hibernacja wygląda na nazwy kolumn & mapowania?
  3. jakie są inne możliwe atrybuty adnotacji @JoinTable?
+1

czy klucze obce w tabeli łączenia tbl_linkcategoryadvert mają nazwy categories_id i advertisment_id? W przeciwnym razie konieczne może być skonfigurowanie mapowania @JoinTable w celu odzwierciedlenia tych nazw. –

+0

Czy wiesz, jak wygląda tabela 'ogłoszeń? Być może musisz zdefiniować kolumnę wiele do wielu, np. '@JoinTable (name =" ads ", joinColumns = @ JoinColumn (name =" cat_id "))'? –

+0

Po prostu edytuj swoje pytanie w przyszłości, aby podać więcej szczegółów. Sprawdź także link do pomocy w formatowaniu w edytorze. –

Odpowiedz

0

Chcesz użyć adnotacji @Jointable na zajęciach, które są właścicielami związku. Będziesz musiał umieścić adnotacje @Jointable na klasie Advertisement.

2

Hibernacja generuje nazwę kolumny "categories_id" dla kolumny łączenia, w której tabela używa nazwy "identyfikator_kategorii". Przewodnik referencyjny ma przykład: how to map a many-to-many relationship. W otaczającym tekście jest również kilka istotnych szczegółów. Powinieneś po prostu wykonać mapowanie w swojej kategorii.getAdverts() wygląda następująco:

@JoinTable(
    name="tbl_linkcategoryadvert", 
    [email protected](name="category_id"), 
    [email protected](name="advert_id") 
) 
Powiązane problemy