-->
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.  [ 17 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: [gelöst] n zu 1 abbilden
PostPosted: Fri Jan 16, 2009 9:10 am 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
Hi,

meine Tabelle sieht so aus:

Artikel
id
name
artikel_art

Artikel_Art
id
name

Beispieleintrag für Artikel:
id name artikel_art
30 stuhl 4711

Beispieleintrag für Artikel_Art:
id name
4711 Möbel

Wie bilde ich in der Mappingdatei von Artikel und Artikel_Art diese Beziehung ab? Danke.

Gruß,
henryf


Last edited by henryf on Fri Jan 16, 2009 3:59 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:15 am 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Als many-to-one von Artikel zu Artikel-Typ

Beispiele gibts in der Anleitung ;o)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:44 am 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Als many-to-one von Artikel zu Artikel-Typ

Beispiele gibts in der Anleitung ;o)


Also das auslesen klappt soweit.

Aber wenn ich aus Artikel_Art Objekte auslesen und beim Erstellen neuer Artikel eines dieser Objekte zuweise dann steht bei mir der Defaultwert (also 0) drin.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 11:40 am 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Bitte mal Deinen Code posten und am besten SQL Log auch dazu


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 12:12 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Bitte mal Deinen Code posten und am besten SQL Log auch dazu


Artikel.hbm.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
               "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
   <class name="Artikel" table="Artikel">
      <id name="id" column="id" type="java.lang.Integer">
         <generator class="increment" />
      </id>
      <property name="name" column="name" type="java.lang.String" />
      <many-to-one name="artikelArt" class="uk.ac.napier.hois.model.ArtikelArt" column="artikel_art" insert="false" update="false" />
   </class>
</hibernate-mapping>


Artikel.java:
Code:
import java.io.Serializable;
public class Arikel implements Serializable {
   private Integer id;
   private String name;
   private ArtikelArt artikelArt;

   public Integer getId() {
      return id;
   }

   public void setId(Integer id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public Kind_of_herb getArtikelArt() {
      return artikelArt;
   }

   public void setArtikelArt(ArtikelArt artikelArt) {
      this.artikelArt = artikelArt;
   }
}


ArtikelArt.java:
Code:
import java.io.Serializable;
public class ArtikelArt implements Serializable {
   private Integer id;
   private String name;

   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}


ArtikelArt.hbm.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
   <class name="ArtikelArt" table="Artikel_Art">
      <id name="id" column="id" type="java.lang.Integer">
         <generator class="increment" />
      </id>
      <property name="name" column="name" type="java.lang.String" />
   </class>
</hibernate-mapping>


ArtikelTest:
Quote:
public class ArtikelTest {
public static void main(String[] args) {
Session session = InitSessionFactory.getInstance().getCurrentSession();

Artikel artikel1 = new Artikel();
artikel1.setName("ArtikelA");

session.beginTransaction();
List<ArtikelArt> artikelArts = session.createQuery("select h from Artikel_Art as h").list();
List <Artikel> artikel = session.createQuery("select h from Artikel as h").list();
session.close();
// Hier ist die Ausgabe für den ersten Tabelleneintrag den ich manuell angelegt habe richig. Er hat eine verknüpfte ArtikelArt
System.out.println(artikel.get(0).getArtikelArt().getName());

artikel1.setArtikelArt(artikelArts.get(0));
createArtikel(artikel1);
// Wenn ich danach select * from Artikel; ausführe sehe ich in der Tabelle eine 0 bei der Spalte artikel_art.
}
private static void createArtikel(Artikel artikel) {
Transaction tx = null;
Session session = InitSessionFactory.getInstance().getCurrentSession();
try {
tx = session.beginTransaction();
session.save(artikel);
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx != null && tx.isActive())
tx.rollback();
}
}

Code:
Es läuft durch ohne Fehler.


Last edited by henryf on Fri Jan 16, 2009 1:38 pm, edited 2 times in total.

Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:23 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Du hast da glaub ich die Reihenfolge der Aktionen etwas verdreht...

Code:
session.beginTransaction();
Artikel artikel1 = new Artikel();
artikel1.setName("ArtikelA");

List<Kind_of_herb> artikelArts = session.createQuery("select h from Artikel_Art as h").list();
List <Herb> artikel = session.createQuery("select h from Artikel as h").list();

artikel1.setArtikelArt(artikelArts.get(0));

session.save(artikel1);


Über List<Kind_of_herb> artikelArts = session.createQuery("select h from Artikel_Art as h").list();

regt sichs bei Dir nicht auf?
Ich muss da immer einen Cast auf den Zieltyp machen... und konkrete Listenklassen verwenden wie ArrayList


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:37 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Du hast da glaub ich die Reihenfolge der Aktionen etwas verdreht...

Code:
session.beginTransaction();
Artikel artikel1 = new Artikel();
artikel1.setName("ArtikelA");

List<Kind_of_herb> artikelArts = session.createQuery("select h from Artikel_Art as h").list();
List <Herb> artikel = session.createQuery("select h from Artikel as h").list();

artikel1.setArtikelArt(artikelArts.get(0));

session.save(artikel1);


Über List<Kind_of_herb> artikelArts = session.createQuery("select h from Artikel_Art as h").list();

regt sichs bei Dir nicht auf?
Ich muss da immer einen Cast auf den Zieltyp machen... und konkrete Listenklassen verwenden wie ArrayList


Eigentlich habe ich keine Artikel und Lieferanten sondern Herbs und Suppliers. Aber da kein Mensch weiß was Herb ist habe ich das in Artikel unbenannt. Dieses Szenario ist auch sofort jedem klar. Und dann musste ich natürlich den Quellcode nach dem Kopieren ändern. Bisschen doof. Da müsste also
Code:
List<ArtikelArt> artikelArts = session.createQuery("select h from Artikel_Art as h").list();

stehen. :-)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:41 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
Also was ich bei dem ArtikelTest machen will ist:

Alle Artikelarten auslesen und dem neuen Testartikel eine Artikelart zuweisen. Allerdings steht in dem Feld artikel_art nicht der Primärschlüssel sondern eine 0 (sprich Defaultwert) nach dem persistieren.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:53 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Keine Sorge ich hätte schon gewusst was Herbs sind... ;o)

Ich hätts so geschrieben:
Code:
ArrayList<KindOfHerb> kindOfHerb = (ArrayList<KindOfHerb>)session.createQuery("from kindOfHerb").list();


Probiers mal mit dem Code den ich gepostet hab, in deinem Beispiel hattest Du 2 Sessions und tw. ausserhalb der Session gearbeitet.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:58 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Keine Sorge ich hätte schon gewusst was Herbs sind... ;o)

Ich hätts so geschrieben:
Code:
ArrayList<KindOfHerb> kindOfHerb = (ArrayList<KindOfHerb>)session.createQuery("from kindOfHerb").list();


Probiers mal mit dem Code den ich gepostet hab, in deinem Beispiel hattest Du 2 Sessions und tw. ausserhalb der Session gearbeitet.


Danke, habs grad getestet. Immer noch das selbe. Ich hab irgendwie den Verdacht, dass ihm die Zuordnung fehlt was er letztendlich in das FK-Feld eintragen soll. Sprich den PK von KindOfHerb bzw. ArtikelArt. Aber vlt irr ich mich auch...


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 2:05 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Keine Sorge ich hätte schon gewusst was Herbs sind... ;o)

Ich hätts so geschrieben:
Code:
ArrayList<KindOfHerb> kindOfHerb = (ArrayList<KindOfHerb>)session.createQuery("from kindOfHerb").list();


Probiers mal mit dem Code den ich gepostet hab, in deinem Beispiel hattest Du 2 Sessions und tw. ausserhalb der Session gearbeitet.


Danke, habs grad getestet. Immer noch das selbe. Ich hab irgendwie den Verdacht, dass ihm die Zuordnung fehlt was er letztendlich in das FK-Feld eintragen soll. Sprich den PK von KindOfHerb bzw. ArtikelArt. Aber vlt irr ich mich auch...


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 2:38 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Wenn Du die Liste der Herbs hast, gib mal die Daten von einem aus ob das richtig zurückkommt.

Und dreh das SQL Log auf um zu sehen was Hibernate macht.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 3:11 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Wenn Du die Liste der Herbs hast, gib mal die Daten von einem aus ob das richtig zurückkommt.

Und dreh das SQL Log auf um zu sehen was Hibernate macht.

Code:
public static void main(String[] args) {
      Session session = InitSessionFactory.getInstance().getCurrentSession();
      
      Herb herb1 = new Herb();
      herb1.setCommonName("herbA");
      herb1.setLatinName("herbA");
      
      session.beginTransaction();
      ArrayList<KindOfHerb> kindOfHerbs = (ArrayList<KindOfHerb>) session.createQuery("select h from KindOfHerb as h").list();
      ArrayList<Herb> herbs = (ArrayList<Herb>) session.createQuery("select h from Herb as h").list();
      
      System.out.println("KindOfHerbs:");
      for (Iterator iter = kindOfHerbs.iterator(); iter.hasNext();) {
         KindOfHerb element = (KindOfHerb) iter.next();
         System.out.println(element.getId() + " " + element.getKindName());
      }
      
      System.out.println("Herbs:");
      for (Iterator iter = herbs.iterator(); iter.hasNext();) {
         Herb element = (Herb) iter.next();
         System.out.println(element.getId() + " " + element.getLatinName() + " " + element.getKindOfHerb().getKindName());
      }
      herb1.setKindOfHerb(kindOfHerbs.get(0));
      session.close();
      createHerb(herb1);
      
      
   }

Und mein Log sieht so aus:
Code:
Hibernate: select kindofherb0_.id as id3_, kindofherb0_.kind_name as kind2_3_ from KindOfHerb kindofherb0_
Hibernate: select herb0_.id as id1_, herb0_.common_name as common2_1_, herb0_.latin_name as latin3_1_, herb0_.volume as volume1_, herb0_.ratio as ratio1_, herb0_.quant as quant1_, herb0_.kind_of_herb as kind7_1_ from Herb herb0_
KindOfHerbs:
1 dry
2 liquid
Herbs:
1 herbB dry
Hibernate: select kindofherb0_.id as id3_0_, kindofherb0_.kind_name as kind2_3_0_ from KindOfHerb kindofherb0_ where kindofherb0_.id=?
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [uk.ac.napier.hois.model.KindOfHerb#0]
   at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
   at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
   at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
   at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
   at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
   at uk.ac.napier.hois.model.KindOfHerb$$EnhancerByCGLIB$$5dbd528b.getKindName(<generated>)
   at uk.ac.napier.hois.test.HerbTest.main(HerbTest.java:40)

Die Fehlermeldung:
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [uk.ac.napier.hois.model.KindOfHerb#0]
kommt daher dass er den ersten manuell angelegten Herb ausliest und deren KindOfHerb. Aber der 2. Eintrag ist von dem Durchlauf davor angelegt worden wo die KindOfHerb 0 ist und die gibt es halt nicht.
Code:
mysql> select * from Herb;
+----+-------------+------------+--------+-------+-------+--------------+
| id | common_name | latin_name | volume | ratio | quant | kind_of_herb |
+----+-------------+------------+--------+-------+-------+--------------+
|  1 | herbA       | herbB      |        |       |       |            1 |
|  2 | herbA       | herbA      | NULL   | NULL  | NULL  |            0 |
+----+-------------+------------+--------+-------+-------+--------------+
2 rows in set (0.00 sec)

Code:
mysql> select * from KindOfHerb;
+----+-----------+
| id | kind_name |
+----+-----------+
|  1 | dry       |
|  2 | liquid    |
+----+-----------+
2 rows in set (0.00 sec)


Ich habe <property name="hibernate.show_sql">true</property> gesetzt in der hibernate.cfg.xml. Kann man das log noch mehr aufdrehen?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 3:46 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Das mit dem SQL Log passt schon so
Der Fehler ist verständlich, weil halt 0 drinsteht.

Wie hast du den Eintrag mit kind_of_herb 1 eingefügt? händisch?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 3:52 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Das mit dem SQL Log passt schon so
Der Fehler ist verständlich, weil halt 0 drinsteht.

Wie hast du den Eintrag mit kind_of_herb 1 eingefügt? händisch?

ja genau händisch.

Hab jetzt eine Lösung gefunden. Hab in der Herb.hbm.xml folgendes geändert:
Code:
<many-to-one name="kindOfHerb" class="uk.ac.napier.hois.model.KindOfHerb" column="kind_of_herb"
         insert="true" update="true" />

Hab bei insert und update true gesetzt. Hatte ja ursprünglich die Werte weggelassen. Aber hibernate brachte eine Meldung ich sollte insert und update festlegen mit false. Jetzt müsste ich natürlich wissen welche Auswirkungen das hat.

Eigentlich werden die KindOfHerbs nie wieder angerührt. Die KindOfHerb ist für die Programmlogik da um zu entscheiden welche Felder im Herb gesetzt werden müssen. Es gibt nur 2 KindOfHerbs und das bleibt auch so.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 17 posts ]  Go to page 1, 2  Next

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.