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:
sowie
die dazugehoerigen Hibernate Mappings sehen so aus:
und
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:
Nun bekomme ich diesen Fehler:
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
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: