2013-04-20 13 views
6

"AuthorInternet" ve "userId" bileşik anahtarına sahip bir "AuthorFollow" tablosu var. "&" UserInfo "tablosu sırasıyla.java.sql.SQLException: Parametre dizini aralık dışında (3> 2 olan parametre sayısı)

"AuthorFollow" nesnesini veritabanına kaydetmeye çalışıyorum (mysql kullanıyorum). Ama hatayı alıyorum: nesneyi kaydetmek için,

org.hibernate.exception.GenericJDBCException: could not insert: [com.pojo.hibernate.AuthorFollow] 
. 
. 
. 
Caused by: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2). 
. 
. 
. 

kodunu i çalışıyorum geçerli:

Transaction transaction = hibernateTemplate.getSessionFactory().getCurrentSession().beginTransaction(); 
    try { 
     AuthorFollow authorFollow = new AuthorFollow(); 
     authorFollow.setAuthorId(authorInfo.getAuthorId()); 
     authorFollow.setUserId(userInfo.getUserId()); 
     authorFollow.setAuthorInfoByAuthorId(authorInfo); 
     authorFollow.setUserInfoByUserId(userInfo); 

     authorInfo.getAuthorFollowsByAuthorId().add(authorFollow); 
     userInfo.getAuthorFollowsByUserId().add(authorFollow); 

     updateObject(authorInfo); 
     updateObject(userInfo); 

     transaction.commit(); 
     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     transaction.rollback(); 
     return false; 
    } 

haritalama dosyaları (Bu eşleştirmeleri oto IntellijIdea tarafından oluşturulan): AuthorFollow.hbm.xml:

<hibernate-mapping> 
    <class name="com.pojo.hibernate.AuthorFollow" table="author_follow" catalog="book"> 
    <composite-id mapped="true" class="com.pojo.hibernate.AuthorFollowPK"> 
     <key-property name="userId" column="user_id"/> 
     <key-property name="authorId" column="author_id"/> 
    </composite-id> 
    <many-to-one name="authorInfoByAuthorId" class="com.pojo.hibernate.AuthorInfo"> 
     <column name="author_id" not-null="true"/> 
    </many-to-one> 
    <many-to-one name="userInfoByUserId" class="com.pojo.hibernate.UserInfo"> 
     <column name="user_id" not-null="true"/> 
    </many-to-one> 
    </class> 
</hibernate-mapping> 

AuthorInfo.hbm.xml (AuthorFollow sadece eşleme gösteriliyor):

<set name="authorFollowsByAuthorId" inverse="true"> 
     <key> 
      <column name="author_id" not-null="true"/> 
     </key> 
     <one-to-many not-found="ignore" class="com.pojo.hibernate.AuthorFollow"/> 
    </set> 

UserInfo.hbm.xml (AuthorFollow için sadece eşleme gösteriliyor):

<set name="authorFollowsByUserId" inverse="true"> 
     <key> 
      <column name="user_id" not-null="true"/> 
     </key> 
     <one-to-many not-found="ignore" class="com.pojo.hibernate.AuthorFollow"/> 
    </set> 

GÜNCELLEME:

Hibernate: select userinfo0_.user_id as user1_21_, userinfo0_.first_name as first2_21_, userinfo0_.last_name as last3_21_, userinfo0_.user_gender as user4_21_, userinfo0_.user_img as user5_21_, userinfo0_.user_birthdate as user6_21_, userinfo0_.user_occupation as user7_21_, userinfo0_.user_qualification as user8_21_, userinfo0_.user_postal_code as user9_21_, userinfo0_.user_address as user10_21_, userinfo0_.user_city as user11_21_, userinfo0_.user_contact as user12_21_, userinfo0_.user_balance as user13_21_, userinfo0_.user_website as user14_21_, userinfo0_.email_verified as email15_21_, userinfo0_.email_id as email16_21_ from book.user_info userinfo0_ where userinfo0_.email_id=? 
Hibernate: select authorinfo0_.author_id as author1_3_0_, authorinfo0_.author_name as author2_3_0_, authorinfo0_.author_pen_name as author3_3_0_, authorinfo0_.author_gender as author4_3_0_, authorinfo0_.author_description as author5_3_0_, authorinfo0_.author_blog_link as author6_3_0_, authorinfo0_.author_img as author7_3_0_, authorinfo0_.author_lives as author8_3_0_, authorinfo0_.author_born as author9_3_0_, authorinfo0_.author_died as author10_3_0_, authorinfo0_.author_notable_works as author11_3_0_ from book.author_info authorinfo0_ where authorinfo0_.author_id=? 
Hibernate: select userinfo0_.user_id as user1_21_, userinfo0_.first_name as first2_21_, userinfo0_.last_name as last3_21_, userinfo0_.user_gender as user4_21_, userinfo0_.user_img as user5_21_, userinfo0_.user_birthdate as user6_21_, userinfo0_.user_occupation as user7_21_, userinfo0_.user_qualification as user8_21_, userinfo0_.user_postal_code as user9_21_, userinfo0_.user_address as user10_21_, userinfo0_.user_city as user11_21_, userinfo0_.user_contact as user12_21_, userinfo0_.user_balance as user13_21_, userinfo0_.user_website as user14_21_, userinfo0_.email_verified as email15_21_, userinfo0_.email_id as email16_21_ from book.user_info userinfo0_ where userinfo0_.user_id=? 
Hibernate: select authorfoll0_.author_id as author2_3_1_, authorfoll0_.user_id as user1_1_, authorfoll0_.author_id as author2_1_, authorfoll0_.user_id as user1_1_0_, authorfoll0_.author_id as author2_1_0_ from book.author_follow authorfoll0_ where authorfoll0_.author_id=? 
Hibernate: select authorfoll0_.user_id as user1_21_1_, authorfoll0_.user_id as user1_1_, authorfoll0_.author_id as author2_1_, authorfoll0_.user_id as user1_1_0_, authorfoll0_.author_id as author2_1_0_ from book.author_follow authorfoll0_ where authorfoll0_.user_id=? 
Hibernate: insert into book.author_follow (author_id, user_id) values (?, ?) 
+0

Lütfen bir şeyler yapabilir misiniz? hibernate.cfg.xml 'içinde" true 'ile hibernate trace'da değiştirip sonucu kaydedebilir misiniz? Oluşturulan ifadedeki bir şey yanlış görünüyor. – Johanna

+0

tamamlandı, şimdi izlemeyi ekledim. –

cevap

5

hazırda hata mesajı zor görmeyi yapar belli değil sorunun nerede olduğu. Bu yüzden sana bir +1 verdim.

Sayfanız: AuthorFollow eşlemesinde doğru değil. author_id ve user_id'u iki kez eşlersiniz. Hazırda bekle bunu halledemez. Eklemede, parametreleri sayarken başarısız olur. Her sütun yalnızca bir kez eşleştirilmelidir (yalnızca bir eşleme okunmuşsa, ancak bu özel durum sorununuza ilgi göstermiyorsa).

1) Basit Çözüm: yerine AuthorInfo ve UserInfo nesnelerin kimlikleri ile çalışma:

<hibernate-mapping> 
    <class name="com.pojo.hibernate.AuthorFollow" table="author_follow" catalog="book"> 
    <composite-id mapped="true" class="com.pojo.hibernate.AuthorFollowPK"> 
     <key-property name="userId" column="user_id"/> 
     <key-property name="authorId" column="author_id"/> 
    </composite-id> 
    </class> 
</hibernate-mapping> 

No <many-to-one> özellikleri artık

iki çözümü vardır. Açıkça bir AuthorInfo veya UserInfo örneğine ihtiyacınız varsa, ayrı bir Session.load() bildirimini yüklemeniz gerekir.

2) Kompleks çözüm: Kullanım <key-many-to-one>:

<hibernate-mapping> 
    <class name="com.pojo.hibernate.AuthorFollow" table="author_follow" catalog="book"> 
    <composite-id mapped="true" class="com.pojo.hibernate.AuthorFollowPK"> 
     <key-many-to-one name="authorInfoByAuthorId" class="com.pojo.hibernate.AuthorInfo" column="author_id"/> 
     <key-many-to-one name="userInfoByUserId" class="com.pojo.hibernate.UserInfo" column="user_id"/> 
    </composite-id> 
    </class> 
</hibernate-mapping> 

Ben çok kullanım veya 2'de daha karmaşık çözümü için diğer iyi nedenler) varsa haricinde basit bir çözüm 1) kullanılması tavsiye edilir. Çözüm 2) kesinlikle daha fazla sorun.

+0

Çok teşekkürler. İkinci çözümü denedim ve çalıştı (Ama, 'AuthorFollowPK' sınıfını kullanmadım). Sütunların iki kez eşlendiğini düşünmüştüm, ancak eşlemeler otomatik olarak oluşturuldu ve çok az eşleme bilgisine sahiptim, bu yüzden kodumun bir problemi olacağını düşündüm :) –

+0

"AuthorFollowPK" sınıfını unutabilirsiniz. gerekli değil.Sadece oradaydı çünkü kodunuzdan kopyalayıp yapıştırdım. – Johanna