2011-10-09 12 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 प्रदान नहीं के रूप में यह केवल हाइबरनेट बॉयलरप्लेट कोड शामिल कर रहा हूँ।

जब मैं मैं अपवाद निम्नलिखित पाने मुख्य वर्ग चलाएँ:

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. हाइबरनेट कॉलम नाम & मैपिंग के लिए कैसे दिखता है?
  3. @ जॉइनटेबल एनोटेशन के लिए अन्य संभावित विशेषताएं क्या हैं?
+1

अपनी जॉइन टेबल में विदेशी कुंजी करें tbl_linkcategoryadvert नाम श्रेणियों_आईडी और adsments_id हैं? अन्यथा आपको उन नामों को दर्शाने के लिए अपने @ जॉइनटेबल मैपिंग को कॉन्फ़िगर करना पड़ सकता है। –

+0

क्या आप बता सकते हैं कि 'विज्ञापन' तालिका कैसी दिखती है? शायद आपको कई से अधिक स्तंभों को परिभाषित करने की आवश्यकता है उदा। '@ जॉइनटेबल (नाम =" विज्ञापन ", joinColumns = @ JoinColumn (name =" cat_id "))'? –

+0

अधिक जानकारी प्रदान करने के लिए कृपया भविष्य में अपना प्रश्न संपादित करें। साथ ही, संपादक में स्वरूपण सहायता लिंक देखें। –

उत्तर

0

आप रिश्ते के मालिक के वर्ग पर @Jointable एनोटेशन का उपयोग करना चाहते हैं। आपको विज्ञापन वर्ग पर @Jointable टिप्पणियां रखने की आवश्यकता होगी।

2

हाइबरनेट आपके शामिल कॉलम के लिए कॉलम नाम "श्रेणियां_आईडी" उत्पन्न कर रहा है, जहां आपकी तालिका "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") 
) 
संबंधित मुद्दे