-->
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.  [ 4 posts ] 
Author Message
 Post subject: Mapping: wo liegt der Fehler
PostPosted: Tue Jun 19, 2007 5:10 am 
Newbie

Joined: Tue Nov 15, 2005 10:18 am
Posts: 13
Hallo zusammen,

ich habe eine Mapping-Datei mit folgendem Inhalt erstellt:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>
   <class
     name="de.xx.xx.xx.data.ChargeZusatzinfo"
     table="CHA03P"
     schema="%CHA03P%"
     dynamic-update="true"
     optimistic-lock="all">

      
      <meta attribute="implement-equals">true</meta>
      <meta attribute="extra-import">de.xx.xx.xx.persistence.EntityImpl</meta>   
      <meta attribute="extends">EntityImpl</meta>

      

      <composite-id name="chargeZusatzinfoID" class="de.xx.xx.xx.data.id.ChargeZusatzinfoID">

         
         <meta attribute="gen-idMethods">true</meta>

         <key-property
            name="institutsnummer"
            column="CHDNR"
            type="de.xx.xx.core.persistence.type.IntegerType"
            length="3">
            
            <meta attribute="property-type">int</meta>
            <meta attribute="use-in-equals">true</meta>
                 <meta attribute="use-in-tostring">true</meta>
         </key-property>

         <key-property
            name="artikelnummer"
            column="CHARTNR"
            type="de.xx.xx.core.persistence.type.IntegerType">
            <meta attribute="property-type">int</meta>
         </key-property>
         <key-property
            name="chargennummer"
            column="CHNR"
            type="de.xx.xx.core.persistence.type.StringType"
            length="16">
            <meta attribute="property-type">String</meta>
         </key-property>
         
         
         <key-property
            name="artikelnummerHerstell"
            column="CHART1"
            type="de.xx.xx.core.persistence.type.IntegerType">
            <meta attribute="property-type">int</meta>
         </key-property>
         <key-property
            name="chargennummerHerstell"
            column="CHNR1"
            type="de.xx.xx.core.persistence.type.StringType"
            length="16">
            <meta attribute="property-type">String</meta>
         </key-property>

      </composite-id>


      <property
         name="anzahlHerstell"
         column="CHANZHP"
         type="de.xx.xx.core.persistence.type.IntegerType">
         <meta attribute="property-type">int</meta>
      </property>

         

      </class> 
</hibernate-mapping>


Anschliessend habe ich folgende ABfrage erstellt:

Code:
public List getErgebniss(){
      PersistenceManager pm = super.getPersistenceManager();
      Criteria c = pm.createCriteria(ChargeZusatzinfo.class);
      c.add(Expression.eq("chargeZusatzinfoID.institutsnummer", new Integer(111)));
      return pm.findAllByCriteria(c);
      
   }


Eigentlich müsste ich über 100 000 Datensätze bekommen. Aber tatsächlich liefert er mir nur einen!
Wo liegt mein Fehler?

DANKE und LG
Vicky


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 19, 2007 5:35 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Hmm die generierte Abfrage wäre noch ganz schön zu sehen.

Aber mal ne generelle Frage zum Design:
Müssen diese 5 Teilschlüssel zwingend den PK bilden?
Denn wesentlich einfach wär es bei einem solch komplizierten Schlüssel einfach einen technischen statt eines fachlichen PK einzuführen und die bisherigen Composite-PK-Teile nun als not-null Attribute und die Kombination als Unique-Constraint zu hinterlegen. Es erleichtert später auch die Identifikaton eines bestimmten Datensatzes.

Ich denke im Moment liegt der Fehler bei Dir in der eigentlichen Abfrage die Du nicht gepostet hast (pm.findAllByCriteria(c);). Wäre schön wenn Du da noch was posten könntest.
Es sollte auf jeden Fall byExample gesucht werden, ansonsten geht Hibernate davon aus, dass alle Attribute in der Kombination vorliegen müssen, wie Du sie ihm übergeben hast.

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 19, 2007 5:49 am 
Newbie

Joined: Tue Nov 15, 2005 10:18 am
Posts: 13
Hallo,

leider können wir keine bestehenden Dateien ändern. Sehr viel Programme sind so aufgebaut, dass sie mit diesem 5-fachen PK arbeiten. Mein Chef würde mir den Vogel zeigen :-)))

Das ist dabei erstellte SQL-Anweisung.

Code:
select this.CHDNR as CHDNR0_, this.CHARTNR as CHARTNR0_, this.CHNR as CHNR0_, this.CHART1 as CHART10_, this.CHNR1 as CHNR10_, this.CHANZHP as CHANZHP0_ from %CHA03P%.CHA03P this where this.CHDNR=?


Sie sieht eigentlich richtig aus!



Code:
public List findAllByCriteria(Criteria criteria){
        try {
            NDC.push("findAllByCriteria()");

            if (TRACE_DBCALLS) {
                logger.debug(BEGIN_DBOPERATION);
            }

            List rst = criteria.list();

            if (TRACE_DBCALLS) {
                logger.debug(END_DBOPERATION);
            }

            List result = this.distinct(rst);

            if (EntityContext.hasEntityCache()) {
                EntityContext.putEntities(result);
            }

            return result;
        } catch (ObjectNotFoundException oe) {
            return new ArrayList();
        } catch (Exception e) {
            throw new PersistenceException(PersistenceException.STATUS_NONE, e);
        } finally {
            NDC.pop();
        }
    }



Was muss ich denn übergeben, wenn ich mit "findbyExample" suche???

LG
Vicky


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 19, 2007 6:45 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Hast recht, das SQL sieht schlüssig aus. Was kommt den für ein Ergebnis, wenn Du das generierte Statement über einem normalen SQL-Client abschickst? Vielleicht ist Eure Abfrage-Methode so konfiguriert, dass sie Dir immer nur das erste Ergebnis aus der Liste zurückgibt.

Hmm ansonsten denke ich das müsste ne Änderung in der Methode erfolgen, welche die eigentliche Abfrage (Criteria) zusammenbaut.

Bsp.:

Cat cat = new Cat();//Vergleichsobjekt
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class) //Auf Basis der Klasse eine neue Criteria
.add( Example.create(cat) )//das Vergleichsobjekt hinzufügen
.list();


15.6. Example queries

Es werden jetzt alle Katzen gefunden, welche weiblich und schwarz sind. Ähnlich kannst Du es dann mit Deinem Teil-PK machen.

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


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