-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Anfänger. Zwei Objekte 1:m
PostPosted: Tue Aug 29, 2006 5:39 pm 
Newbie

Joined: Tue Aug 29, 2006 5:03 pm
Posts: 12
Location: Leipzig
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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 30, 2006 2:29 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Versuche mal die Klasse Long für die ID zu verwenden statt den Typ long.
Gruß Sebastian

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 31, 2006 6:30 pm 
Newbie

Joined: Tue Aug 29, 2006 5:03 pm
Posts: 12
Location: Leipzig
Hallo,

danke !!! Funktioniert !!! Super !!

leider hänge ich nun schon am nächsten Fehler.

Exception in thread "AWT-EventQueue-0" org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of Familie.Kind.setVaterid

Caused by: net.sf.cglib.beans.BulkBeanException: Familie.Vater

Caused by: java.lang.ClassCastException: Familie.Vater


Der Fehler tritt an der Stelle der Iterator-initialisierung auf.

Query baba = session.createQuery("from Vater where vorname ='Heiko');

Vater v = (Vater) baba.list().get(0);

Iterator itr = v.getKinder().iterator();

Kind k = (Kind) itr.next();

System.out.println(k.getHobby());



Was hab ich nur falsch gemacht?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 01, 2006 2:32 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Bei Kind brauchst Du ein Property vom Typ Vater und nicht von vater_id
Üblicherweise macht man die auch private.

class Kind
...
private Vater vater;

public Vater getVater(){
return vater;
}
....


Ein Rating wäre ganz nett.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Sun Sep 03, 2006 2:41 am 
Newbie

Joined: Tue Aug 29, 2006 5:03 pm
Posts: 12
Location: Leipzig
Danke, Danke, das hat geholfen. Supergut! Jetzt macht das Programmieren wieder Spaß.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.