Hibernate Problem

mephiztophelez

Grünschnabel
Hallo,
ich sitze gerade schon seit ein paar Stunden vor einem Problem und komme nicht recht weiter.
Ich moechte einen einfachen Shop fuer ein Studienprojekt erstellen und moechte dazu Hibernate nutzen um auf eine MySQL DB zuzugreifen. Ich arbeite mit der MyEclipseIDE

Momentan benutze ich erstmal nur eine Tabelle "Categories" und "Products" die folgendermassen definiert sind:

Code:
CREATE TABLE `products` (
  `pid` int(10) unsigned NOT NULL auto_increment,
  `pname` varchar(45) NOT NULL default '',
  `pdescription` text NOT NULL,
  `pprice` float NOT NULL default '0',
  `ptax` float NOT NULL default '0',
  `pquantity` int(10) unsigned NOT NULL default '0',
  `p_catid` int(10) unsigned NOT NULL default '0',
  `pimageurl` text NOT NULL,
  `pdateadded` varchar(45) NOT NULL default '',
  `pdateedit` varchar(45) NOT NULL default '',
  PRIMARY KEY  (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

sowie
Code:
CREATE TABLE `categories` (
  `cid` int(10) unsigned NOT NULL auto_increment,
  `cname` varchar(45) NOT NULL default '',
  `cparentid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


die dazugehoerigen Hibernate Mappings sehen so aus:
Code:
    <class name="Products" table="products">
        <id name="pid" column="pid" type="java.lang.Integer">
            <generator class="native"/>
        </id>
		
        <property name="pname" column="pname" type="java.lang.String"  not-null="true" />
        <property name="pdescription" column="pdescription" type="java.lang.String"  not-null="true" />
        <property name="pprice" column="pprice" type="java.lang.Float"  not-null="true" />
        <property name="ptax" column="ptax" type="java.lang.Float"  not-null="true" />
        <property name="pquantity" column="pquantity" type="java.lang.Integer"  not-null="true" />
        <property name="pCatid" column="p_catid" type="java.lang.Integer"  not-null="true" />
		<many-to-one name="categories" update="false" insert="false" class="Categories" column="p_catid"/>
        <property name="pimageurl" column="pimageurl" type="java.lang.String"  not-null="true" />
        <property name="pdateadded" column="pdateadded" type="java.lang.String"  not-null="true" />
        <property name="pdateedit" column="pdateedit" type="java.lang.String"  not-null="true" />
  		
    </class>

und

Code:
<class name="Categories" table="categories">
		<id name="cid" column="cid" type="java.lang.Integer">
			<generator class="native" />
		</id>
		<set name="products" cascade="all" inverse="false" lazy="true">
      <key column="p_catid"/>
      <one-to-many class="Products"/> 
    </set>
    
		<property name="cname" column="cname" type="java.lang.String"
			not-null="true" />
		<property name="cparentid" column="cparentid"
			type="java.lang.Integer" not-null="true" />
	</class>


Bisher habe ich es schon hinbekommen Daten in die DB per Hib zu schreiben, jedoch bekomme ich beim auslesen eine Fehlermeldung.

Ich benutze eine Testklasse um einfach erstmal die Funktionalitaet zu testen, bevor ich das ganze in eine Webanwendung umsetze.

Die Funktion zum auslesen eines Produktes sieht so aus:
Code:
	private List getProductsByCatid(int cid) {
		System.out.println("############# read product");
		Categories cat = null;

		List productList = null;

		try {
			Transaction tx = session.beginTransaction();

			cat = (Categories) session.get(Categories.class, new Integer(cid));
			productList = cat.getProducts();

			// System.out.println("Descr:" + product.getPdescription());

			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		return productList;

	}


Nun bekomme ich diesen Fehler:

Code:
...snip...

1562 [main] DEBUG net.sf.hibernate.loader.Loader  - total objects hydrated: 2
net.sf.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of de.christoph.shop.Categories.products
	at net.sf.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:68)
	at net.sf.hibernate.persister.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:230)
	at net.sf.hibernate.impl.SessionImpl.initializeEntity(SessionImpl.java:2223)
	at net.sf.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:315)
	at net.sf.hibernate.loader.Loader.doQuery(Loader.java:305)
	at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133)
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:911)
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:931)
	at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:59)
	at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:51)
	at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:415)
	at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:2130)
	at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:2000)
	at net.sf.hibernate.impl.SessionImpl.get(SessionImpl.java:1936)
	at de.christoph.shop.ShopTest.getProductDetailsById(ShopTest.java:117)
	at de.christoph.shop.ShopTest.main(ShopTest.java:61)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at net.sf.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:38)
	... 15 more
Exception in thread "main" java.lang.NullPointerException
	at de.christoph.shop.ShopTest.main(ShopTest.java:62)
1562 [main] DEBUG net.sf.hibernate.impl.SessionImpl  - resolving associations for [de.christoph.shop.Categories#2]
1572 [main] DEBUG net.sf.hibernate.impl.SessionImpl  - creating collection wrapper:[de.christoph.shop.Categories.products#2]
1572 [main] ERROR net.sf.hibernate.property.BasicPropertyAccessor  - IllegalArgumentException in class: de.christoph.shop.Categories, setter method of property: products
1572 [main] ERROR net.sf.hibernate.property.BasicPropertyAccessor  - expected type: net.sf.hibernate.collection.List, actual value: net.sf.hibernate.collection.Set


Ich denke die letzten 2 Zeilen sind ausschlaggebend. Ich habe die one2many verkuepfung im Hibernate Mapping als SET definiert. Aber scheinbar stoert er sich daran, wenn ich das mit einer java.util.List benutzen will.
Habe das aber aus diesem Tutorial, wo statt einem SET ein BAG benutzt wird, was aber den selben Fehler bringt.
Tutorial: http://www.laliluna.de/assets/tutorials/struts-hibernate-integration-tutorial-en.pdf

Naja vielleicht kann mir ja jemand von euch folgenden und hat ein paar Ideen.
Daten einfuegen klappt super, jedoch beim auslesen kommt das hier.

Vielen Dank
Christoph
 
Zuletzt bearbeitet:
Danke Thomas,
der Beitrag hat geholfen. Ich hatte einen Fehler in der Product Klasse - entspricht also der Player klasse.
Dort hatte ich dummerweise die Variable "categorie" auch mit dem Typ List angelegt, was aber vom Typ "Categories" haette sein muessen.
Dann hatte ich bei der ganzen Testerei noch im Mapping File der Categories das inverse auf "true" gesetzt. Als ich dann inverse wieder auf "false" gesetzt habe, und die unnoetige Settermethoder "setCategories" in Product entfernt habe gings.

Jetzt wird mir das langsam klarer.
Danke fuer deine Hilfe.

Ciao
Christoph
 

Neue Beiträge

Zurück