Hallo,
ich versuche gerade mich in die Hibernate-Technik einzuarbeiten und bin schon etwas sehr ins Stocken geraten.
Ich werde aus verschiedenster Literatur und Tutorials nicht wirklich schlauer, was mein Problem angeht.
Kurzbeschreibung:
ich habe mal als Beispiel nachgebaut: Zwei Klassen:
Objekt: Vater
Objekt: Kind
Vater zu Kind verhält sich 1:n
Vater hat als Attribute: id, name und vorname.
Kind hat als Attribute: id, jahre, hobby und vater_id
Ein Vaterobjekt mit den Attributen in einer session zu belegen und das session.save(vater) funktionier prima.
Wenn ich nun ein Kind hinzufügen möchte bekomme ich folgende Fehlermeldung:
23:28:19,734 ERROR BasicPropertyAccessor:167 - IllegalArgumentException in class: Familie.Vater, getter method of property: id
Exception in thread "AWT-EventQueue-0" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of Familie.Vater.id
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
Die Mappings und Klassen:
Vater:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Familie.Vater" >
<id name="id" column="id" type="long">
<generator class="increment"/>
</id>
<property name="name"/>
<property name="vorname"/>
<set name="kinder" cascade="all" lazy="true" >
<key column="vater_id"/>
<one-to-many class="Familie.Kind"/>
</set>
</class>
</hibernate-mapping>
Kind:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Familie.Kind" >
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="jahre"/>
<property name="hobby"/>
<many-to-one name="vater_id" column="vater_id" class="Familie.Vater"/>
</class>
</hibernate-mapping>
public class Vater
{
public long id;
public String name;
public String vorname;
public Set kinder = new HashSet();
public long getId(){return id;}
public String getVorname(){return vorname;}
public String getName(){return name;}
public Set getKinder(){return kinder;}
public void setId(long id){ this.id = id;}
public void setName(String name){this.name=name;}
public void setVorname(String vorname){this.vorname=vorname;}
public void setKinder(Set kinder){this.kinder=kinder;}
/** Creates a new instance of Vater */
public Vater()
{
}
}
public class Kind
{
public long id;
public String jahre;
public String hobby;
public long vater_id;
public long getId() {return id;}
public String getJahre(){return jahre;}
public String getHobby(){return hobby;}
public long getVater_id(){return vater_id;}
public void setId(long id){this.id=id;}
public void setJahre(String jahre){this.jahre = jahre;}
public void setHobby(String hobby){this.hobby=hobby;}
public void setVater_id(long vater_id){this.vater_id=vater_id;}
/** Creates a new instance of Kind */
public Kind()
{
}
}
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = null;
Transaction transaction = null;
private void KindAnlegen(java.awt.event.MouseEvent evt)
{
Session session = null;
Transaction transaction = null;
session = sessionFactory.openSession();
transaction = session.beginTransaction();
Kind k = new Kind();
k.setJahre(jTextField3.getText());
k.setHobby(jTextField4.getText());
Query baba = session.createQuery("from Vater where vorname ='"+jTextField2.getText()+"'");
List result2 = baba.list();
Vater v = (Vater) result2.get(0);
//k.setVater_id(v.getId());
v.getKinder().add(k);
// session.save(k);
transaction.commit();
session.close();
}
private void VaterAnlegen(java.awt.event.MouseEvent evt)
{
Session session = null;
Transaction transaction = null;
Vater v=new Vater();
v.setName(jTextField1.getText());
v.setVorname(jTextField2.getText());
session = sessionFactory.openSession();
transaction = session.beginTransaction();
session.save(v);
transaction.commit();
session.close();
}
private void schemaExport(java.awt.event.MouseEvent evt)
{
SchemaExport export = new SchemaExport(configuration);
export.create(false,true);
}
Der Fehler tritt in der KindAnlegen() beim session.save bzw. transaction.commit() auf. Der SchemaExport funktioniert prima.
Also ich will sozusagen ein Kind anlegen was einen Vater mit einem Vornamen hat. Ich weiß dass der Code so wie er jetzt nicht, nicht wirklich produktiv gehen kann, ich wollte ja nur einen haben, den man mal flink posten kann. Wie man in der KindAnlegen() sehen kann, weiß ich nicht wirklich, wie ich vorgehen muss. Wie muss ich weiter vorgehen?
Ich bin über jede Art der Hilfe dankbar!!
MfG Heiko
|