2010-01-16 15 views
8

Aus heiterem Himmel habe ich im Hibernate "IllegalArgumentException: Argumenttypenkonflikt" erhalten. Die Hibernate-Entity arbeitete lange und svn-Logs bestätigen, dass der Code intakt ist.IllegalArgumentException: Argumenttyp stimmt nicht mit Hibernate überein

Was könnte der Fall sein?
Hier ist Teil der Ausnahme

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) 
+1

Alle Änderungen an einer Datenbanktabelle? –

+0

Unveränderte Änderungen, yeah –

+0

Noch möchten Sie Ihre .hbm-Dateien überprüfen, um zu sehen, dass sich diese Änderungen überschneiden? – Sands

Antwort

8

Übersetzung: Hibernate stellt ein Argument vom falschen Typ bereit, wenn versucht wird, eine Setter-Methode aufzurufen.

Mein erster Schritt wäre herauszufinden, welcher Setter das ist (z. B. durch Debuggen der Anwendung in Eclipse, Festlegen eines Ausnahmeblockpunkts und Überprüfen der Stackvariablen, sobald der Breakpoint erreicht ist).

Bearbeiten: Was ist die Signatur des Setter für die zugeordnete Eigenschaft qs? Es sollte eine Set<Q> dauern.

+0

Sie haben Recht. Es war ein falscher Typ. Liste statt Set –

3

Ich habe aufgrund der zugrundeliegenden Datenbankfeld dieses Geschehens gehört Änderungen (wie zB Datum Zeitstempel). Es könnte sich lohnen, die Datenbankänderungen rückgängig zu machen, wenn Sie dazu in der Lage sind und es testen, oder die .hbm-Datei oder die Anmerkungen wie Sands vorgeschlagen zu überprüfen.

+0

@Kaleb rechts. Die Hinzufügung dieses Codes zur hbm hat diesen Fehler verursacht. 'Hast du eine Ahnung, warum es so sein könnte? –

3

Also, Sie haben eine Hibernate-Mapping-Datei geändert, ohne die Entität zu ändern? Ich vermute, dass die qs Eigenschaft schon da war. Aber ist es ein java.util.Set (wie Sie einen <set> zu map your collection verwendeten)?

1

Die Lösung ist die Verwendung von "addScalar" in Ihrer Abfrageausführung.

Ihre Entity Angenommen, ein Benutzer:

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

Statt tun:

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

Verwendung addScalar:

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

Hinweis: vor LongType.INSTANCE gibt war Hibernate.LONG und Hibernate.STRING (sie sind veraltet jetzt).

Verwandte Themen