Hibernate: Problem mit IdClass und NativeQuery

Herr_M

Erfahrenes Mitglied
Hallo Zusammen,

Ich habe ein Problem bei der Verwendung eines Native Querys mit Hibernate.

Ich habe ein Native Query, dessen Resultset über ein SqlResultSetMapping auf 3 verschiedene Beans gemapt ist. Eines der Beans eine IdClass (FormKriterienBean.java), da sich dessen Primary Key aus 2 Attributen zusammensetzt.

Führe ich nun das Query aus, erhalte ich für die beiden Beans ohne den zusammengesetzten Primary Key meine Werte (KriterienBean, KritGruppenBean), und für die Klasse mit IdClass (FormKriterienBean.java) nur "null".
Deaktiviere ich den zusammengesetzten Key, dadurch dass ich die @IdClass Annotation einfach auskommentiere, so erhalte ich beim ausführen für alle 3 Beans die Werte.

Hat jemand ne Idee was hier nicht stimmt?
Und vor allem was kann ich dagegen tun?

Hier noch ein paar Codeschnipsel und Klassen:

Erstmal der Codeschnipsel der das NativeQuery erzeugt und ausführt:
Code:
public List<KriterienCombinationValueObject> selectFormkriterien(int foidx)
      throws Exception {

    try {
      System.out.println("AccessSessionBean - selectFormkriterien(int foidx)");

      String sqlStmt =
          " SELECT  " +
          " k.kritgruppennr AS kritgruppennr, " +
          " kg.kritgruppenbez AS kritgruppenbez, " +
          " k.krname AS krname, " +
          " fk.text AS text, " +
          " fk.foidx AS foidx, " +
          " fk.krnr AS krnr, " +
          " fk.fknr AS fknr, " +         
          
          " k.krnr AS kkrnr, k.krtyp AS kkrtyp, " +
          " kg.kritgruppennr AS kgkritgruppennr" +
          
          " FROM " +
          "   formkriterien fk, " +
          "   kriterien k, " +
          "   kritgruppen kg " +
          " WHERE fk.foidx = " + foidx +
          "   AND k.krnr = fk.krnr " +
          "   AND k.kritgruppennr = kg.kritgruppennr "; 
        
      List<KriterienCombinationValueObject> listeFormKriterien =
          new ArrayList<KriterienCombinationValueObject>();

      Query query = manager.createNativeQuery(sqlStmt, "formkriterienUndKriterienUndKriterienGruppen");

      @SuppressWarnings("unchecked")
      List resultList = query.getResultList();

      for (int i = 0; i < resultList.size(); i++) {
        KriterienCombinationValueObject formKriterium = new KriterienCombinationValueObject();

        Object obj = resultList.get(i);
        Object[] objArray = (Object[]) obj;
        
        KriterienBean kb = (KriterienBean) objArray[1];
        KritGruppenBean kgb = (KritGruppenBean) objArray[2];
        FormKriterienBean fkb = (FormKriterienBean) objArray[0];//TODO Ist im Moment null

        formKriterium.setKritgruppennr(kgb.getKritGruppenNr());
        formKriterium.setKritgruppenbez(kgb.getKritGruppenBez() == null? "":kgb.getKritGruppenBez());
        formKriterium.setKrname(kb.getKrName() == null? "":kb.getKrName());               
        formKriterium.setFormkriterientext(fkb.getText() == null? "":fkb.getText());
        
        listeFormKriterien.add(formKriterium);
      }
      return listeFormKriterien;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

Hier die Klasse FormKriterienBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;

import javax.persistence.*;

@Entity
@IdClass(FormKriterienPK.class)
@Table(name="FORMKRITERIEN")
@SqlResultSetMapping(name="formkriterienUndKriterienUndKriterienGruppen",
    entities={@EntityResult(entityClass=FormKriterienBean.class),   
              @EntityResult(entityClass=KriterienBean.class,
                  fields={@FieldResult(name="krNr", column="kkrnr"),
                          @FieldResult(name="kritGruppenNr", column="kritgruppennr"),
                          @FieldResult(name="krName", column="krname"),
                          @FieldResult(name="krTyp", column="kkrtyp")}),
              @EntityResult(entityClass=KritGruppenBean.class,
                  fields={@FieldResult(name="kritGruppenBez", column="kritgruppenbez"),
                          @FieldResult(name="kritGruppenNr", column="kgkritgruppennr")})
              })
@SequenceGenerator(name="KRITGRUPPENNR_SEQUENCE", sequenceName="SEQ_FORMKRITERIEN_FOIDX")              
public class FormKriterienBean implements java.io.Serializable {

  private int foIdx;
  private int fkNr;
  private String text = "";
  private Integer krNr = Integer.valueOf(0);

  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRITGRUPPENNR_SEQUENCE")
  public int getFkNr() {
    return fkNr;
  }
  public void setFkNr(int fkNr) {
    this.fkNr = fkNr;
  }

  @Id
  public int getFoIdx() {
    return foIdx;
  }
  public void setFoIdx(int foIdx) {
    this.foIdx = foIdx;
  }
  public String getText() {
    return text;
  }
  public void setText(String text) {
    this.text = text;
  }
  public Integer getKrNr() {
      return krNr;
  }
  public void setKrNr(Integer krNr) {
    this.krNr = krNr;
  }
}

Hier die IdClass dazu FormKriterienBeanPK
Code:
package com.de.irgendeinefirma.fmdb.ejb;

public class FormKriterienPK implements java.io.Serializable {
  private Integer foIdx = 0;
  private Integer fkNr = 1;

  public FormKriterienPK() {}

  public FormKriterienPK(int foIdx, int fkNr) {
    this.foIdx = foIdx;
    this.fkNr = fkNr;
  }

  public int getFkNr() {
    return fkNr;
  }

  public void setFkNr(int fkNr) {
    this.fkNr = fkNr;
  }

  public int getFoIdx() {
    return foIdx;
  }

  public void setFoIdx(int foIdx) {
    this.foIdx = foIdx;
  }

  public boolean equals(Object obj){
    if( obj == this){
      return true;
    }
    if(!(obj instanceof FormKriterienPK)) {
      return false;
    }
    FormKriterienPK pk = (FormKriterienPK)obj;
    if(fkNr != pk.fkNr){
      return false;
    }
    if( foIdx != pk.foIdx){
      return false;
    }
    return true;
  }

  public int hashCode(){
    return (int)fkNr + (int)foIdx;
  }

}

Hier die Klasse KritGruppenBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;

import javax.persistence.*;
@Entity
@Table(name = "KRITGRUPPEN")
@SequenceGenerator(name="KRITGRUPPENNR_SEQUENCE", sequenceName="SEQ_KRITGRUPPEN_NR")//TODO Sequenz in DB erstellen und Name vergeben
public class KritGruppenBean implements java.io.Serializable {
  
  private int kritGruppenNr = 0;
  private String kritGruppenBez = "";

  public String getKritGruppenBez() {
    return kritGruppenBez;
  }
  public void setKritGruppenBez(String kritGruppenBez) {
    this.kritGruppenBez = kritGruppenBez;
  }

  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRITGRUPPENNR_SEQUENCE")
  public int getKritGruppenNr() {
    return kritGruppenNr;
  }
  public void setKritGruppenNr(int kritGruppenNr) {
    this.kritGruppenNr = kritGruppenNr;
  }
}

Und hier die Klasse KriterienBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;

import javax.persistence.*;

@Entity
@Table(name = "KRITERIEN")
@SqlResultSetMapping(name="formkriterienUndkriterien",
    entities={@EntityResult(entityClass=KriterienBean.class,
                  fields={@FieldResult(name="krName", column="kriterien.krname"),
                          @FieldResult(name="krTyp", column="kriterien.krtyp")}),
              @EntityResult(entityClass=FormKriterienBean.class,
                  fields={@FieldResult(name="foidx", column="formkriterien.foidx"),
                          @FieldResult(name="krNr", column="formkriterien.krnr"),
                          @FieldResult(name="text", column="formkriterien.text")})
              })
@SequenceGenerator(name="KRNR_SEQUENCE", sequenceName="SEQ_KRITERIEN_KRNR")
public class KriterienBean implements java.io.Serializable {

  private int krNr;
  private int kritGruppenNr;
  private String krName;
  private Integer krTyp;

  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRNR_SEQUENCE")
  public int getKrNr() {
    return krNr;
  }
  public void setKrNr(int krNr) {
    this.krNr = krNr;
  }

  public int getKritGruppenNr() {
    return kritGruppenNr;
  }
  public void setKritGruppenNr(int kritGruppenNr) {
    this.kritGruppenNr = kritGruppenNr;
  }

  public String getKrName() {
    return krName;
  }
  public void setKrName(String krName) {
    this.krName = krName;
  }

  public Integer getKrTyp() {
      return krTyp;
  }
  public void setKrTyp(Integer krTyp) {
    this.krTyp = krTyp;
  }
}
 
Warum nutzt du eigentlich einen OR Mapper, wenn du das Mapping dann doch wieder von hand machst? Nagel die @Column Annotationen an die Klassenmember, schreib den Query in JPAQL. Damit sparst du dir locker 50% des Codes den du da oben gpostet hast.

Zum Thema: wo hält denn deine FormKriterien Bean eine Instanz der Schlüsselklasse? Einfach zwei gleiche Felder zu deklarieren kann nicht funktionieren. Irgendwie vergewaltiugst du das ganze Konzept etwas ;).

Vielleicht noch ein paar kleine Codestylegeschichten. Domänenklassennamen sollte nicht durch irgendwelche technischen Artefakte (Bean) verwässert werden. Das machst einfach nur schwerer zu verstehen. Zumal der Begriff Bean hoffnungslos überladen ist. Genausogut könntest du Komponente anhängen. Deutsch als Sprache ist in Code auch foo. Aus dem gleichen Grund - es wird nur unnötig komplex zu lesen. Vorallem der Denglischmischmasch macht es nicht besser ;).

Gruß Ollie
 
Hallo,

Der ganze Code ist das Ergebnis folgender "Ereignise"
Ein Typ mit wenig Ehrfahrung (also ich) wird an ein Programm gesetzt, das er nicht kennt und solle ein Redesign machen. Das Programm ist nicht dokumentiert, benutzt Bibliotheken eines anbieters, der seine Bibltiotheken ebenfalls nicht dokumentiert hat. Diese Bibliotheken sollen abgelöst werden. Mit einer Technologie von der ich zu Beginn der Arbeiten ebenfalls keine Ahnung hatte.
Der nativeSQL stammt noch aus dem alten Programm welches direkt auf die Datenbank Zugriff hatte und keine Persistenzschicht verwendet hat. Da man bei EJB 3.0 ja auch nativeQuerys verwenden kann und ich mich mit JPAQL so ganz und garnicht auskenne, dachte ich mir das es wohl das einfachste wäre das alte SQL zu behalten.
Die übrigen Codekonstellationen sind durch nachprogrammieren der Beispiele aus meinem Buch entstanden.
Ich kann eigentlich garnicht recht beurteilen ob der Code gut oder eher schecht ist.

Ich hab inzwischen mal versucht das ganze auf JPAQL umzustellen, leider funktioniert es nicht ganz wie ich mir das vorgestellt habe: Bei "Query query =
manager.createQuery(queryString);" fliegt ne Exception, die ich nicht nachvollziehen kann. Laut meinem Buch müsste das Query so wie es ist ok sein.
Gut die Beispiele im Buch sind leider nur mit 2 Tabellen/Beans, nicht mit 3 wie hier. Aber ich dachte, ne dritte Tabelle mit einem weiteren LEFT JOIN sollte doch funktionieren? So viel anders als normales SQL ist JPAQL ja auch nicht oder?
Code:
public List<KriterienCombinationValueObject> selectFormkriterien(int foidx)
      throws Exception {

    try {
      System.out.println("AccessSessionBean - selectFormkriterien(int foidx)");

      String queryString =
          " SELECT  " + " k.kritgruppennr AS kritgruppennr, "
              + " kg.kritgruppenbez AS kritgruppenbez, "
              + " k.krname AS krname, " + " fk.text AS text, "
              + " fk.foidx AS foidx, " + " fk.krnr AS krnr, "
              + " fk.fknr AS fknr "              
              + " FROM " 
              + "   FormKriterienBean fk LEFT OUTER JOIN " 
              + "   KriterienBean k LEFT OUTER JOIN "
              + "   KritGruppenBean kg " 
              + " WHERE fk.foidx = ?1 "
              + "   AND k.krnr = fk.krnr "
              + "   AND k.kritgruppennr = kg.kritgruppennr ";

      List<KriterienCombinationValueObject> listeFormKriterien =
          new ArrayList<KriterienCombinationValueObject>();

      Query query =
          manager.createQuery(queryString);
              //,"formkriterienUndKriterienUndKriterienGruppen");
      query.setParameter(1, foidx);

      @SuppressWarnings("unchecked")
      List resultList = query.getResultList();

      for (int i = 0; i < resultList.size(); i++) {
        KriterienCombinationValueObject formKriterium =
            new KriterienCombinationValueObject();

        Object obj = resultList.get(i);
        Object[] objArray = (Object[]) obj;

        KriterienBean kb = (KriterienBean) objArray[1];
        KritGruppenBean kgb = (KritGruppenBean) objArray[2];
        FormKriterienBean fkb = (FormKriterienBean) objArray[0];// TODO Ist im
                                                                // Moment null

        formKriterium.setKritgruppennr(kgb.getKritGruppenNr());
        formKriterium.setKritgruppenbez(kgb.getKritGruppenBez() == null ? ""
            : kgb.getKritGruppenBez());
        formKriterium.setKrname(kb.getKrName() == null ? "" : kb.getKrName());
        formKriterium.setFormkriterientext(fkb.getText() == null ? "" : fkb
            .getText());

        listeFormKriterien.add(formKriterium);
      }
      return listeFormKriterien;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

Stacktrace:
Code:
09:58:48,760 INFO  [STDOUT] AccessSessionBean - selectFormkriterien(int foidx)
09:58:52,900 ERROR [PARSER]  Path expected for join!
09:58:52,946 ERROR [PARSER]  Invalid path: 'k.kritgruppennr'
09:58:52,962 ERROR [PARSER] <AST>:0:0: unexpected end of subtree
09:59:20,740 ERROR [STDERR] java.lang.NullPointerException
09:59:20,740 ERROR [STDERR] 	at org.hibernate.hql.ast.HqlSqlWalker.setAlias(HqlSqlWalker.java:844)
09:59:20,740 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.aliasedSelectExpr(HqlSqlBaseWalker.java:2069)
09:59:20,740 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1832)
09:59:20,740 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1394)
09:59:20,740 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:553)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
09:59:20,771 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:92)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.entity.TransactionScopedEntityManager.createQuery(TransactionScopedEntityManager.java:134)
09:59:20,771 ERROR [STDERR] 	at com.de.otto.fmdb.ejb.AccessSessionBean.selectFormkriterien(AccessSessionBean.java:1480)
09:59:20,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
09:59:20,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
09:59:20,771 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
09:59:20,771 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Method.java:597)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
09:59:20,771 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:304)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
09:59:20,771 ERROR [STDERR] 	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
09:59:20,771 ERROR [STDERR] 	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769)
09:59:20,771 ERROR [STDERR] 	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573)
09:59:20,771 ERROR [STDERR] 	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373)
09:59:20,771 ERROR [STDERR] 	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)
09:59:20,802 INFO  [STDOUT] AccessSessionBean - getFormularArtBezeichnung(int foidx)
09:59:20,818 INFO  [STDOUT] Hibernate: SELECT FOARTBEZ FROM VORGANGTYPEN, FORMULARE WHERE VORGANGTYPEN.FOART = FORMULARE.FOART AND FORMULARE.FOIDX =2760
09:59:21,193 INFO  [STDOUT] AccessSessionBean - selectAuflagen(int aktFoIdx)
09:59:21,240 INFO  [STDOUT] Hibernate: select auflagenbe0_.auIdx as auIdx164_, auflagenbe0_.foIdx as foIdx164_, auflagenbe0_.auBestmenge as auBestme3_164_, auflagenbe0_.auPreis as auPreis164_, auflagenbe0_.auBestDat as auBestDat164_, auflagenbe0_.auAnfAbt as auAnfAbt164_, auflagenbe0_.auAnfAnlief as auAnfAnl7_164_, auflagenbe0_.auAnfKstSt as auAnfKstSt164_, auflagenbe0_.auAnfTele as auAnfTele164_, auflagenbe0_.auAuft as auAuft164_, auflagenbe0_.auChangedate as auChang11_164_, auflagenbe0_.auDatFrei as auDatFrei164_, auflagenbe0_.auDruck as auDruck164_, auflagenbe0_.auFreiDat as auFreiDat164_, auflagenbe0_.auKorr as auKorr164_, auflagenbe0_.auLiefDat as auLiefDat164_, auflagenbe0_.auMa_fm as auMa17_164_, auflagenbe0_.auMa_te as auMa18_164_, auflagenbe0_.auTyp as auTyp164_ from AUFLAGEN auflagenbe0_ where auflagenbe0_.foIdx=? order by auflagenbe0_.auBestDat
 
Klingt nach nem in der freien Wildbahn üblichen Projekt ;). Schau dir doch einfach mal ein zwei Tutorials zu JPA an. Das Netz ist voll davon. In JPAQL definierst du halt keine Spaltennamen sondern arbeitest mit den Namen Klassenmembern. Das Mapping auf die Spalten geschieht dann über @Column.

Aber ehrlich gesagt steht sowas in JEDEM Einsteigertutorial zu JPA, das man im Netz findet.

Ich glaub ein Guter Plan ist es, einfach mal ein Tutorial zu JPA durchzuspielen und darinh gelerntes auf dein Problem zu übertragen. Bisher hast du ja eigentlich nur eine Technologie genommen und mit dieser völlig unbedarft auf das Problem eingeschlagen. Es ist halt einfach komisch, das jemand versucht Compundkeys zu modellieren, wenn er noch nichtmal einen Überblick über Basismappings hat. :) Ich will nicht rummotzen, aber du machst den 2. Schritt vor dem 1.

Gruß
Ollie
 
Jo eigentlich hast du mit den Tutorials recht, das aus meinem EJB Buch schein nicht das beste zu sein wie sich jetzt rausgestellt hat. Entschuldige, dass ich jetzt erst antworte, aber ich war die letzten Tage krank, so wie ich mich grade fühle werd ich wohl auch gleich wieder die Segel streichen müssen.
 

Neue Beiträge

Zurück