2013-04-20 5 views
6

Mam tabelę "AuthorFollow" mającą klucz złożony "authorId" i "userId", które są kluczami podstawowymi w "AuthorInfo "& Tabela" UserInfo ".Wywołanie java.sql.SQLException: indeks parametru poza zakresem (3> liczba parametrów, która wynosi 2)

Próbuję zapisać obiekt "AuthorFollow" w bazie danych (używam mysql). Ale ja dostaję błąd:

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). 
. 
. 
. 

kod, który próbuję, aby zapisać obiekt jest:

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; 
    } 

Pliki mapping (mapowanie te są automatycznie generowane przez IntelliJ IDEA) 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 (pokazano tylko na mapowanie AuthorFollow)

<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 (widocznych mapowanie tylko dla AuthorFollow):

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

UPDATE:

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

Czy mógłbyś. przełącz w ślad hibernacji z ' true' in 'hibernate.cfg.xml' i opublikuj wynik? Coś w wygenerowanym komunikacie wydaje się błędne. – Johanna

+0

zrobione, dodałem teraz ślad. –

Odpowiedz

5

Komunikat o błędzie z Hibernate nie jest jasne, co sprawia, że ​​trudno jest zobaczyć gdzie jest problem. Dlatego dałem ci +1.

Twój błąd: w mapowaniu AuthorFollow jest niepoprawny. Mapujesz dwa razy author_id i user_id. Hibernate nie może sobie z tym poradzić. We wstawce nie powiedzie się podczas liczenia parametrów. Każda kolumna powinna być odwzorowana tylko raz (chyba że jedno mapowanie jest tylko do odczytu, ale ten specjalny przypadek nie jest interesujący dla twojego problemu).

Istnieją dwa rozwiązania:

1) Proste rozwiązanie: Praca z identyfikatorami zamiast AuthorInfo i UserInfo obiektów:

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

nr <many-to-one> właściwości więcej. Jeśli wyraźnie potrzebujesz instancji AuthorInfo lub UserInfo, musisz załadować osobną instrukcję Session.load().

2) Kompleksowe rozwiązanie: Wykorzystanie <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> 

polecam użyć prostego rozwiązania: 1) z wyjątkiem przypadku jest użycie partii lub inne powody, dla bardziej złożonych roztworze 2). Rozwiązanie 2) jest zdecydowanie większym problemem.

+0

Wielkie dzięki. Wypróbowałem drugie rozwiązanie i zadziałało (ale nie użyłem klasy "AuthorFollowPK"). Pomyślałem również, że kolumny zostały odwzorowane dwa razy, ale mapowania zostały wygenerowane automatycznie i mam bardzo mało wiedzy o mapowaniach, więc myślałem, że mój kod będzie miał jakiś problem :) –

+0

Możesz zapomnieć o klasie 'AuthorFollowPK', niekoniecznie.To właśnie tam było, ponieważ skopiowałem i wkleiłem kod. – Johanna

Powiązane problemy