web-dev-qa-db-ja.com

IllegalArgumentException:Hibernateでの引数タイプの不一致

突然、休止状態で「IllegalArgumentException:引数タイプの不一致」が発生し始めました。 Hibernateエンティティはかなり長い間機能しており、svnログはコードが無傷であることを確認します。

どうなるのでしょうか?
これが例外の一部です

Jan 16, 2010 10:47:09 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
Java.lang.IllegalArgumentException: argument type mismatch
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.Java:42)
    at org.hibernate.Tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.Java:337)
    at org.hibernate.Tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.Java:200)
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.Java:3566)
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.Java:129)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.Java:854)
    at org.hibernate.loader.Loader.doQuery(Loader.Java:729)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:236)
    at org.hibernate.loader.Loader.doList(Loader.Java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2104)
    at org.hibernate.loader.Loader.list(Loader.Java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.Java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.Java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.Java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.Java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.Java:79)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.Java:930)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.Java:419)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.Java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.Java:921)
11
Quintin Par

翻訳:Hibernateは、setterメソッドを呼び出そうとすると、間違ったタイプの引数を提供します。

私の最初のステップは、それがどのセッターであるかを見つけることです(たとえば、Eclipseでアプリケーションをデバッグし、例外ブレークポイントを設定し、ブレークポイントに達したらスタック変数を検査します)。

編集:マップされたプロパティqsのセッターの署名は何ですか? Set<Q>が必要です。

9
meriton

解決策は、クエリの実行で "addScalar"を使用することです。

エンティティがユーザーであるとします。

@Entity
@Table(name="user")
@DynamicUpdate(value=true)
public class UserEntity implements Serializable{    

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id",updatable=false)
private Long id;

@Column(name="name",nullable=false,length=20)
private String name;
....
}

する代わりに:

List<UserEntity> users = sessionFactory.getCurrentSession()
      .createQuery(query)
      .list();

AddScalarを使用します:

List<UserEntity> users = sessionFactory.getCurrentSession()
     .createQuery(query)
     .addScalar("id",LongType.INSTANCE)
     .addScalar("name",StringType.INSTANCE)         
     .list();

:LongType.INSTANCEの前には、Hibernate.LONGとHibernate.STRINGがありました(現在は非推奨です)。

4
gezdy

それで、エンティティを変更せずに休止状態のマッピングファイルを変更しましたか? qsプロパティはすでにそこにあったと思います。しかし、それはJava.util.Set<set>を使用して コレクションをマップ )ですか?

3
Pascal Thivent

これは、基になるデータベースフィールドの変更(日付からタイムスタンプなど)が原因で発生していると聞いています。可能であればデータベースの変更を元に戻してテストするか、Sandsが提案したように.hbmまたは注釈を確認する価値があるかもしれません。

3
Kaleb Brasee

タイプに互換性がない場合に発生することがありました。 MySQLクエリの場合、互換性のためにキャストの変換に続いて行う必要があります。

select CAST(sum(hours) AS SIGNED) ...

これが、人々がJPA(正確にはJPA-Hibernate)で同様の問題に遭遇するのに役立つことを願っています。

0
zawhtut