[JSP]org.hibernate.ObjectNotFoundException: No row with the given identifier exists

silmepurpurdrache

Grünschnabel
Hallo,

das hier ist die Situation: Ich habe ein Liferay-4.3.4-Webportal und habe ein Portlet geschrieben, das Aufgaben an Personen "verteilt", d.h. es gibt eine Obertabelle (MySQL) ToDoList, die alle Aufgaben enthält, eine Tabelle Responsible, die alle Verantwortlichen für eine bestimmte Aufgabe enthält, und eine Tabelle History, die alle Historieneinträge für eine bestimmte Aufgabe beinhaltet.
Problem scheint hier die Tabelle Responsible zu sein.

Wenn ich einen neuen Verantwortlichen (Responsible) speichern will, mache ich in der SaveAction-Klasse folgendes:
Code:
Set respoBeans = eef.getResponsibles();
		if (respoBeans == null) {
			respoBeans = new HashSet();
		}
		ResponsibleBean rBean = null;
		Set respo = new HashSet<Responsible>();
		Iterator iter = respoBeans.iterator();
		while (iter.hasNext()) {
			rBean = (ResponsibleBean)iter.next();
			Responsible responsible = new Responsible();
			responsible.setUser_id(rBean.getId());
			
			respo.add(responsible);
		}
		eef.setResponsibles(respo);
eef ist EntryEditForm.java, eine Klasse, die Getter und Setter definiert, um Einträge in der JSP abzufangen (arbeitet als Bean).
Responsible ist die Getter- und Setterklasse für die Datenbank-Mappings.

In der JSP sieht das dann folgendermaßen aus:

HTML:
		<tr>
		<td>Verantwortliche(r)</td>
		<td>
		
		<html:select name="EntryEditForm" property="lastResp" style="width:200">
        	<html:optionsCollection name="EntryEditForm" property="screenNameList"  />
       </html:select> 
       
       <logic:notEmpty name="EntryEditForm" property="responsibles">
       <logic:iterate name="EntryEditForm" property="responsibles" id="resp">
       		<br />
       		<bean:write name="resp" property="name" />
       		<input class="portlet-form-button" type="button" value="Löschen" onClick="add('<portlet:actionURL><portlet:param name="_spage" value="/portlet_action/aufgabenliste/del_resp" /></portlet:actionURL>', '<portlet:namespace />form', '<bean:write name="resp" property="id" />'); ">
       </logic:iterate>
       </logic:notEmpty>
       
       <input class="portlet-form-button" type="button" value="Hinzufügen" onClick="add('<portlet:actionURL><portlet:param name="_spage" value="/portlet_action/aufgabenliste/add_resp" /></portlet:actionURL>', '<portlet:namespace />form');">
       </td>
	</tr>
Hier kann man Verantwortliche aus der Liste auswählen (die mit allen Usern der aktuellen Community gefüllt werden) und der (bestehenden) Liste Verantwortlicher hinzufügen.
Wenn ich einen ausgewählt habe, kommt beim Speichern folgende Fehlermeldung:

09:57:26,187 ERROR [StrutsPortlet:380] Include exception
javax.servlet.ServletException: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [de.XXX.portlet.aufgabenliste.hibernate.ToDoList#0]
at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.portals.bridges.struts.PortletTilesRequestProcessor.process(PortletTilesRequestProcessor.java:50)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
at com.liferay.portal.apache.bridges.struts.LiferayRequestDispatcher.invoke(LiferayRequestDispatcher.java:144)
at com.liferay.portal.apache.bridges.struts.LiferayRequestDispatcher.include(LiferayRequestDispatcher.java:74)
at org.apache.portals.bridges.struts.StrutsPortlet.processRequest(StrutsPortlet.java:375)
at org.apache.portals.bridges.struts.StrutsPortlet.processAction(StrutsPortlet.java:279)
at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:101)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
at com.liferay.portlet.CachePortlet._invoke(CachePortlet.java:359)
at com.liferay.portlet.CachePortlet.processAction(CachePortlet.java:181)
at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:385)
at com.liferay.portal.action.LayoutAction.processActionRequest(LayoutAction.java:301)
at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:143)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:157)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:293)
at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:528)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.liferay.portal.servlet.FriendlyURLServlet.service(FriendlyURLServlet.java:134)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.filters.strip.StripFilter.doFilter(StripFilter.java:92)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.filters.compression.CompressionFilter.doFilter(CompressionFilter.java:113)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.filters.secure.SecureFilter.doFilter(SecureFilter.java:144)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.filters.doubleclick.DoubleClickFilter.doFilter(DoubleClickFilter.java:135)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.portal.servlet.filters.layoutcache.LayoutCacheFilter.doFilter(LayoutCacheFilter.java:188)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.doFilter(AutoLoginFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:166)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.liferay.portal.servlet.filters.sessionid.SessionIdFilter.doFilter(SessionIdFilter.java:85)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Unknown Source)

Wenn ich eine Aufgabe ohne Verantwortlichen speichere, geht das ganz normal und die Aufgabe wird gespeichert. Versuche ich, einen Verantwortlichen aus der Liste zu löschen, kommt auch eine Fehlermeldung:

10:15:26,265 ERROR [[PortletActionServlet]:723] Servlet.service() for servlet PortletActionServlet threw exception
javax.servlet.jsp.JspException: No getter method for property: "name" of bean: "resp"
at org.apache.struts.taglib.TagUtils.lookup(TagUtils.java:987)
at org.apache.struts.taglib.bean.WriteTag.doStartTag(WriteTag.java:225)
at org.apache.jsp.html.portlet.aufgabenliste.edit_jsp._jspx_meth_bean_005fwrite_005f3(edit_jsp.java:823)
at org.apache.jsp.html.portlet.aufgabenliste.edit_jsp._jspService(edit_jsp.java:288)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
at com.liferay.portal.apache.bridges.struts.LiferayRequestDispatcher.invoke(LiferayRequestDispatcher.java:144)
at com.liferay.portal.apache.bridges.struts.LiferayRequestDispatcher.include(LiferayRequestDispatcher.java:74)
at org.apache.portals.bridges.struts.PortletServletRequestDispatcher.invoke(PortletServletRequestDispatcher.java:128)
at org.apache.portals.bridges.struts.PortletServletRequestDispatcher.include(PortletServletRequestDispatcher.java:146)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:965)
at org.apache.jsp.html.portlet.aufgabenliste.parent_jsp._jspService(parent_jsp.java:105)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
....

Der Vollständigkeit halber, hier die Bean-Klasse:

Code:
package de.XXX.portlet.aufgabenliste.bean;

public class ResponsibleBean {
	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;
	}
	
	
}
Und hier die Responsible.java.

Code:
package de.XXX.portlet.aufgabenliste.hibernate;

import java.sql.Date;
import java.util.HashSet;
import java.util.Set;

public class Responsible {
	private int id;
	private long user_id;
	
	public Responsible() {}
	public Responsible(long id2, long name) {
		id = (int) id2;
		user_id = name;
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return String.valueOf(getUser_id());
	}
	public long getUser_id() {
		return user_id;
	}
	public void setUser_id(long user_id) {
		this.user_id = user_id;
	}
}
Was mache ich falsch? :confused:
 
Ich habe das Problem mittlerweile ein wenig eingrenzen können (ich mache eigentlich den ganzen Tag nix anderes als zu Debuggen, mir Sachen ausgeben zu lassen etc, ich habe schon in fast allen Klassen Breakpunkte gesetzt).

Was nicht vernünftig gesetzt wird, ist die Aufgabenlisten-Id in der Verantwortlichentabelle, also die Referenz zur ToDoList-Tabelle. Sie ist standardmäßig 0. Wenn ich eine neue Aufgabe erstelle, oder eine bestehende Aufgabe ändere, gibt es den gleichen Effekt:

1. Öffnen der Editseite. die ID ist noch da.
2. Hinzufügen eines Verantwortlichen, die ID ist immer noch da.
3. Speichern - die ID ist weg bzw mit 0 ersetzt, das gibt natürlich eine Fehlermeldung. Ab und zu wird der Verantwortliche aber trotzdem gespeichert (d.h. mit der Aufgabenliste referenziert).

Irgendwo während des 2. Aufrufs der Editseite (also wenn ein Verantwortlicher ausgewählt wurde) verschwindet die ID bzw. wird mit 0 ersetzt.

Hat keiner eine Idee?

Hier nochmal zur Erläuterung die edit-jsp komplett.
HTML:
<jsp:directive.page import="com.liferay.portal.service.UserService"/>
<jsp:directive.page import="com.liferay.portal.service.UserServiceFactory"/><script type="text/javascript">
function add(actionURL, formName)
{
	//alert(actionURL);
	document.forms[formName].action = actionURL;
	document.forms[formName].submit();
}
function add(actionURL, formName, id)
{
	
	document.forms[formName].action = actionURL + '&id=' + id;
	document.forms[formName].submit();
}
</script>


<jsp:directive.page import="java.util.HashMap"/>
<jsp:directive.page import="java.util.Map"/>
<jsp:directive.page import="java.util.Iterator"/>
<jsp:directive.page import="java.util.List"/>
<jsp:directive.page import="com.liferay.portal.theme.ThemeDisplay"/>
<jsp:directive.page import="com.liferay.portal.util.WebKeys"/>
<%@ include file="/html/portlet/aufgabenliste/init.jsp" %>

 <jsp:directive.page import="de.xxx.portlet.aufgabenliste.hibernate.*"/> 

<logic:equal name="EntryEditForm" property="id" value="-1">
	Einen neuen Eintrag hinzufügen:
</logic:equal>
<logic:notEqual name="EntryEditForm" property="id" value="-1">
	Eintrag bearbeiten:
</logic:notEqual>
<br/><br/>
<form action="<portlet:actionURL><portlet:param name="_spage" value="/portlet_action/aufgabenliste/save" /></portlet:actionURL>" method="post" name="<portlet:namespace />form">
<input type="hidden" name="<portlet:namespace />id" value ="<bean:write name="EntryEditForm" property="id"/>"/>
<table>
	<tr>
		<td>Titel</td>
		<td><input class="form-text"  name="<portlet:namespace />title" size="50" maxlength="255" type="text" value="<bean:write name="EntryEditForm" property="title"/>"/></td>
	</tr>	
	<tr>
		<td>Beschreibung</td>
		<td><input class="form-text"  name="<portlet:namespace />description" size="50" maxlength="255" type="text" value="<bean:write name="EntryEditForm" property="description"/>"/></td>
	</tr>
		<tr>
		<td>Verantwortliche(r)</td>
		<td>
		
		<html:select name="EntryEditForm" property="lastResp" style="width:200">
        	<html:optionsCollection name="EntryEditForm" property="screenNameList"  />
       </html:select> 
       <input class="portlet-form-button" type="button" value="Hinzufügen" onClick="add('<portlet:actionURL><portlet:param name="_spage" value="/portlet_action/aufgabenliste/add_resp" /></portlet:actionURL>', '<portlet:namespace />form');">
       <logic:notEmpty name="EntryEditForm" property="responsibles">
       <logic:iterate name="EntryEditForm" property="responsibles" id="resp">
       		<br />
       		<bean:write name="resp" property="name" />
       		<input class="portlet-form-button" type="button" value="Löschen" onClick="add('<portlet:actionURL><portlet:param name="_spage" value="/portlet_action/aufgabenliste/del_resp" /></portlet:actionURL>', '<portlet:namespace />form', '<bean:write name="resp" property="id" />'); ">
       </logic:iterate>
       </logic:notEmpty>
       </td>
	</tr> 
	<tr>
		<td>Externer Verantwortlicher</td>
		<td><input class="form-text"  name="<portlet:namespace />extresp" size="50" maxlength="255" type="text" value="<bean:write name="EntryEditForm" property="extresp"/>"/></td>
	</tr>
 	<tr>
		<td>Abschlussdatum
	</td>
		<td>
		<html:select name="EntryEditForm" property="selectedDay"  style="width:200" >
        	<html:optionsCollection name="EntryEditForm" property="day" />
       </html:select>
		

       	<html:select name="EntryEditForm" property="selectedMonth" style="width:200" >
        	<html:optionsCollection name="EntryEditForm" property="month"  />
       </html:select>  
       	<html:select name="EntryEditForm" property="selectedYear" style="width:200">
        	<html:optionsCollection name="EntryEditForm" property="year"  />
       </html:select> 
        
</td>
	</tr>
<tr>
	<td>Ausführungsgrad</td>
	<td><input class="form-text"  name="<portlet:namespace />executiongrade" size="50" maxlength="255" type="text" value="<bean:write name="EntryEditForm" property="executiongrade"/>"/></td>
</tr>
<tr>
	<td>
	Kommentar zur Änderung
	</td>
	<td>
	<input class="form-text"  name="<portlet:namespace />comments" size="50" maxlength="255" type="text" value="<bean:write name="EntryEditForm" property="comments"/>"/>
	</td>
	</tr>
	
<% 
Map zParams = new HashMap();

zParams.put("id", request.getAttribute("userid"));

pageContext.setAttribute("zParams", zParams);
%>
	<tr>
	<td>
<logic:equal name="EntryEditForm" property="id" value="-1">
	<input class="portlet-form-button" type="button" value="Anlegen" onClick="submitForm(document.<portlet:namespace />form);">
</logic:equal>
<logic:notEqual name="EntryEditForm" property="id" value="-1">
	<input class="portlet-form-button" type="button" value="Speichern" onClick="submitForm(document.<portlet:namespace />form);">
</logic:notEqual>
</td>
<td>	
	<input class="portlet-form-button" type="button" value="Abbrechen" onClick="self.location='<portlet:actionURL><portlet:param name="struts_action" value="/ext/aufgabenliste/overview" /></portlet:actionURL>'">
</td>
</tr>
	<tr>
	<td>
	Historie
	</td>
	<td>
	<logic:notEmpty name="EntryEditForm" property="history">
       <logic:iterate name="EntryEditForm" property="history" id="hist">
       		<br />
       		Name:
       		<bean:write name="hist" property="userName" />, Zeitstempel:
       		<bean:write name="hist" property="inputts" />, Kommentar:
       		<bean:write name="hist" property="comments" />, Ausführungsgrad:
       		<bean:write name="hist" property="executiongrade" />%
       </logic:iterate>
       </logic:notEmpty>
      
	</td>
	</tr>
</table>
</form>
 
Zuletzt bearbeitet:
Zurück