-->
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.  [ 7 posts ] 
Author Message
 Post subject: Eigenschaft von abstrakter Klasse verursacht Fehler
PostPosted: Tue Aug 15, 2006 6:53 pm 
Regular
Regular

Joined: Mon Jul 31, 2006 4:59 pm
Posts: 53
Benutze Hibernate 3.2 mit MySql 5.

Habe die abstrakte Klasse Ressource:

Code:
public abstract class Ressource  {
   
   private long id;
   private String name;
   
   
   public long getId() {
      return id;
   }
   public void setId(long id) {
      this.id = id;
   }
   
   
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}



Von dieser erben 2 weitere kleine Klassen (Gegenstand und Raum).

Klasse Gegenstand:
Code:
public class Gegenstand extends Ressource{
   
   private String wert;

   public String getWert() {
      return wert;
   }

   public void setWert(String wert) {
      this.wert = wert;
   }

}



Klasse Raum:
Code:
public class Raum extends Ressource{
   private String gebaeude;

   public String getGebaeude() {
      return gebaeude;
   }

   public void setGebaeude(String gebaeude) {
      this.gebaeude = gebaeude;
   }
}



In meiner Ressource.hbm.xml steht folgendes nun:
Code:
<hibernate-mapping>

   <class name="uebung9aPackage.Ressource" table="ressource" >
   
   <!-- Dies sind die Eigenschaften der Klasse "Ressource" -->

   <!-- das ID-Feld der Tabelle "ressource" -->
    <id name="id" column="id" type="long">
        <generator class="native"/>
    </id>
 
   <property name="name" column="name" type="string"/>
   
   <discriminator column="disc" type="string" length="1"/>
   
   <subclass name="uebung9aPackage.Raum" discriminator-value="r">
      <property name="gebaeude" column="gebaeude" type="string"/>
   </subclass>
   
   <subclass name="uebung9aPackage.Gegenstand" discriminator-value="g">
      <property name="wert" column="wert" type="string"/>
   </subclass>
   
   
   </class>
   
</hibernate-mapping>



Das Problem liegt nun beim sichern der Eigenschaft "name" der abstrakten Klasse Ressource. Weis der Geier woran das wieder liegt, aber der Befehl scheint falsch zu sein:

Code:
<property name="name" column="name" type="string"/>


Entferne ich diese Zeile wird mein Datensatz gesichert, es ist halt ein Null-Wert in der Spalte "name" vorhanden. Sobald aber diese Zeile drinnen steht kommt folgender Fehler:

Code:
ERROR XMLHelper: - Error parsing XML: XML InputStream(30) The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,resultset*,(query|sql-query)*)".



Weis jemand woran das liegt?


Top
 Profile  
 
 Post subject: Re: Eigenschaft von abstrakter Klasse verursacht Fehler
PostPosted: Wed Aug 16, 2006 3:01 am 
Beginner
Beginner

Joined: Thu Jul 20, 2006 12:08 pm
Posts: 21
Location: Germany
Hiperman wrote:
Benutze Hibernate 3.2 mit MySql 5.

Das Problem liegt nun beim sichern der Eigenschaft "name" der abstrakten Klasse Ressource. Weis der Geier woran das wieder liegt, aber der Befehl scheint falsch zu sein:

Code:
<property name="name" column="name" type="string"/>


Entferne ich diese Zeile wird mein Datensatz gesichert, es ist halt ein Null-Wert in der Spalte "name" vorhanden. Sobald aber diese Zeile drinnen steht kommt folgender Fehler:

Code:
ERROR XMLHelper: - Error parsing XML: XML InputStream(30) The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,resultset*,(query|sql-query)*)".



Weis jemand woran das liegt?


Hallo hiperman,

der Syntax nach muß der discriminator VOR der ersten property stehen !

gruß

ferdinand

_________________
marlon
---
don't hesitate to rate.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 16, 2006 6:46 am 
Regular
Regular

Joined: Mon Jul 31, 2006 4:59 pm
Posts: 53
Vielen vielen dank! Kleiner Fehler, grosse Ursache.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 16, 2006 10:15 am 
Regular
Regular

Joined: Mon Jul 31, 2006 4:59 pm
Posts: 53
Da fällt mir grad ein - wie komme ich an die Daten meiner Subklassen ran? Wenn ich den Termin lade komme ich nur an die Klasse Ressource (Name und ID) ran, aber nicht an die Klassen Gegenstand und Raum.

Code:
Termin t = new Termin();
t = (Termin)session.get(Termin.class, id);



Hab das mal nun so gelöst:
Code:
Termin t = new Termin();
t = (Termin)session.get(Termin.class, id);

Raum r = new Raum();
r = (Raum)session.get(Raum.class, t.getRessource().getId());
         
tx.commit();

System.out.println(r.getGebaeude());


Das klappt aber nur wenn ich genau weis das die Subklasse entweder Raum oder Gegenstand ist. Wie kann ich das nun differenzieren? Irgendwie muss ich doch auf den Diskriminator zugreifen können welcher mir dann exakt sagen kann von welchem Typ der gespeicherte Datensatz ist.

Jemand ne Idee?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 18, 2006 4:29 am 
Beginner
Beginner

Joined: Thu Jul 20, 2006 12:08 pm
Posts: 21
Location: Germany
Hiperman wrote:
Da fällt mir grad ein - wie komme ich an die Daten meiner Subklassen ran? Wenn ich den Termin lade komme ich nur an die Klasse Ressource (Name und ID) ran, aber nicht an die Klassen Gegenstand und Raum.

Code:
Termin t = new Termin();
t = (Termin)session.get(Termin.class, id);



Hab das mal nun so gelöst:
Code:
Termin t = new Termin();
t = (Termin)session.get(Termin.class, id);

Raum r = new Raum();
r = (Raum)session.get(Raum.class, t.getRessource().getId());
         
tx.commit();

System.out.println(r.getGebaeude());


Das klappt aber nur wenn ich genau weis das die Subklasse entweder Raum oder Gegenstand ist. Wie kann ich das nun differenzieren? Irgendwie muss ich doch auf den Diskriminator zugreifen können welcher mir dann exakt sagen kann von welchem Typ der gespeicherte Datensatz ist.

Jemand ne Idee?


Hallo hiperman,

den discriminator brauchst Du nicht explizit anzugeben beim Zugriff.
Beim Zugriff auf die Datenbank definierst du ja einen 'extent' von Objekten in Form von Listen,
Collections was auch immer. Dabei gibst du ja die Klasse an ( "from gebaeude") und erhälst somit eine Liste
aller in der Datenbank gespeicherten Gebäude.

grüße

marlon

_________________
marlon
---
don't hesitate to rate.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 18, 2006 8:54 am 
Regular
Regular

Joined: Mon Jul 31, 2006 4:59 pm
Posts: 53
Hm also was mir halt Kopfzerbrechen bereitet ist wie ich herausfinden kann von welchem Datentyp (Raum oder Gegenstand) die Referenz in Termin ist. Meine Klasse Termin sieht so aus:

Code:
public class Termin implements Serializable {

   private Ressource ressource;
   private long id;
   private String kommentar; 
   public Ressource getRessource()
   {
      return ressource;
   }
   
   public void setRessource(Ressource r)
   {
      ressource = r;
   }
   
   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }
   
   public String getKommentar() {
      return kommentar;
   }

   public void setKommentar(String kommentar) {
      this.kommentar = kommentar;
   }
}


Wie du siehst gibts hier ne Referenz auf die abstrakte Klasse Ressource. Wenn ich nun einen Termin anlegen mit einer Referenz auf z.B. Raum:

Code:
Termin term = new Termin();
Raum raum = new Raum(); // erbt ja von Klasse Ressource

raum.setName("Schlafzimmer"); // Eigenschaft von Klasse Ressource
raum.setGebaeude("Meine Huette");  // Eigenschaft von Klasse Raum

term.setKommentar("Ein Test");  // Eigenschaft von Klasse Termin
term.setRessource(raum);  // speichere die Referenz

session.save(term);



Wenn ich also z.B. einen Query habe, welcher anhand der ID herausfinden soll welcher Termin dies ist und dazu dann noch herausfinden soll ob der Termin nun auf einen Raum oder Gegenstand zeigen soll, wie sollte dieser Query dann aussehen?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 04, 2006 9:41 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Wäre es nicht eine Möglichkeit im eigentlichen Programm einfach das Ressource-Objekt per instanceOf(Raum.class) bzw instanceOf(Gegenstand.class) zu unterscheiden?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 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.