EJB/JPA - Exception beim Erstellen eines PrimaryKey

Cullen

Grünschnabel
Hallo zusammen,

ich bräuchte etwas Hilfe in Sachen EJB 3.0 + JPA.

Ich habe eine Klasse FvFirma erstellt, um damit eine DB-Tabelle zu mappen.
Wenn ich nun einen neuen Datensatz einfügen möchte, sollte über folgende Annotation
Code:
@Id
  @TableGenerator(name="FirmenGen", table="ID_GEN", pkColumnName="ID_NAME",
    valueColumnName="ID_VALUE", pkColumnValue="FirmenId", allocationSize=1)
  @GeneratedValue(strategy=GenerationType.TABLE, generator="FirmenGen")     
  @Column(nullable = false, insertable=true)
  public int getFid() {
    return fid;
  }
aus der Tabelle ID_GEN ein neuer Primärschlüssel für meine Tabelle Firma erstellt werden.

Das klappt aber nicht, anstelle dessen erhalte ich folgende Exception:

07/07/31 13:12:49 javax.persistence.EntityExistsException:
Exception Description: The method [getFid] on the object [jpa.FvFirma] triggered an exception.
Internal Exception: java.lang.reflect.InvocationTargetException
Target Invocation Exception: java.lang.NullPointerException
Mapping: oracle.toplink.essentials.mappings.DirectToFieldMapping[fid-->FV_FIRMA.FID]
Descriptor: RelationalDescriptor(jpa.FvFirma --> [DatabaseTable(FV_FIRMA)])
07/07/31 13:12:49 at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:174)
07/07/31 13:12:49 at jpa.FvFirma.insert(FvFirma.java:333)
07/07/31 13:12:49 at action.FirmaAnlegenAction.weiter(FirmaAnlegenAction.java:184)
07/07/31 13:12:49 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
07/07/31 13:12:49 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
07/07/31 13:12:49 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
07/07/31 13:12:49 at java.lang.reflect.Method.invoke(Method.java:585)
07/07/31 13:12:49 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
07/07/31 13:12:49 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
07/07/31 13:12:49 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
07/07/31 13:12:49 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
07/07/31 13:12:49 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
07/07/31 13:12:49 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
07/07/31 13:12:49 at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
07/07/31 13:12:49 at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
07/07/31 13:12:49 at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:712)
07/07/31 13:12:49 at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:369)
07/07/31 13:12:49 at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:865)
07/07/31 13:12:49 at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:447)
07/07/31 13:12:49 at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:215)
07/07/31 13:12:49 at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:117)
07/07/31 13:12:49 at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:110)
07/07/31 13:12:49 at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
07/07/31 13:12:49 at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:239)
07/07/31 13:12:49 at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:34)
07/07/31 13:12:49 at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:880)
07/07/31 13:12:49 at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
07/07/31 13:12:49 at java.lang.Thread.run(Thread.java:595)

ch weiß, dass mein prinzipielles Vorgehen funktioniert. Bei meiner Fehlersuche habe mit einer Testanwendung diesen DB-Insert nachgestellt und da wurde auch der Primärschlüssel automatisch über die Annotation erstellt. Nur in meinem Projekt will es nicht klappen.
Kann es daran liegen, dass in der Firmen-Klasse Relationsships zu anderen Tabellen bzw. Klassen bestehen?
Vorsorglich ein Auszug aus der Klasse FvFirma
Code:
@ManyToOne
  @JoinColumn(name = "LANDID")
  public Land getLand() {
    return land;
  }
  public void setLand(Land land) {
    this.land = land;
  }
 
  @ManyToOne(cascade={CascadeType.REFRESH})
  @JoinColumn(name = "INSUSR", referencedColumnName="pid", insertable=false, updatable=false)
  public Fhperson getInserter() {
    return inserter;
  }
  public void setInserter(Fhperson inserter) {
    this.inserter = inserter;
  }
 
  @ManyToOne
  @JoinColumn(name = "updusr", referencedColumnName="pid", insertable=false, updatable=false)
  public Fhperson getUpdater() {
    return updater;
  }
  public void setUpdater(Fhperson updater) {
    this.updater = updater;
  }

  @ManyToMany(fetch = FetchType.LAZY, cascade={CascadeType.REFRESH})
  @JoinTable(name="FV_FIRMA_BRANCHE",
            joinColumns={@JoinColumn(name="FID")},
            inverseJoinColumns={@JoinColumn(name="BID")})
  public Collection<FvBranche> getBranchen() {
    return branchen;
  }

  public void setBranchen(Collection<FvBranche> branchen) {
    this.branchen = branchen;
  }
Hoffe, jemand kann mir n'bisserl auf die Sprünge helfen und sag vorsorglich schon mal danke

Cullen
 
Zurück