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
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
Hoffe, jemand kann mir n'bisserl auf die Sprünge helfen und sag vorsorglich schon mal danke
Cullen
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;
}
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;
}
Cullen