deleteButton in dataTable geht nur halb

kiwie

Mitglied
Hallo,
ich hab mal wieder ein Problem.. (ich verwendet Primefaces 3.5, jsf 2.1.26)
Ich habe eine Tabelle, die ist mit einem rowEditor ausgestattet. dieser funktioniert auch. Allerdings wollte ich noch einen Delete Button hinzufügen, aber der geht nicht so richtig.
Hier erstmal der Code:

HTML:
<p:dataTable id="sublist" value="#{subjectService.subjects}" var="Subject"
		rowKey="#{Subject}" editable="true"
		paginator="true" rows="10"> 
		
		<f:facet name="header">Liste der Faecher</f:facet>  
		
		<p:ajax event="rowEdit" update=":form:sublist" listener="#{subjectService.onEdit}"/>
		<p:ajax event="rowEditCancel" listener="#{subjectService.onCancel}" update=":form:sublist" />
		
    	<p:column headerText="Faecher">
    		<p:cellEditor>
    		<f:facet name="output">	
    			<h:outputText value="#{Subject.subjectName}" />
    		</f:facet>
    		<f:facet name="input">	
    			<p:inputText value="#{Subject.subjectName}" />	
    		</f:facet>	
    		</p:cellEditor>	
    	</p:column>
    	
    	<p:column headerText="Studiengang">
    		<p:cellEditor>	
    		<f:facet name="output">	
    			<h:outputText value="#{Subject.studyCourse}" />
    		</f:facet>
    		<f:facet name="input">	
    			<p:inputText value="#{Subject.studyCourse}" />	
    		</f:facet>	
    		</p:cellEditor>	
    	</p:column>
    	
    	<p:column headerText="Edit">	
    		<p:rowEditor />
    		<p:commandButton process="@this" var="Subject" id="subjectDeleteButton" value="Delete" 
    			actionListener="#{subjectService.delete()}" update=":form:sublist">
    			<f:setPropertyActionListener value="#{Subject}" target="#{subjectService.sub}" />
    		</p:commandButton>
    	</p:column>
    
	</p:dataTable>

die delete Methode im Service:
Java:
	@Transactional(readOnly = false)
	public void delete() {
		System.out.println("Subject:  " + sub);
		if(sub.getId() == 0){ //damit es beim ersten drücken keine fehlermeldung gibt.
			return;
		} else {
			//wenn ich nur delete(sub); mache, dann kommt n Fehler, dass ich ein detached Obj. loeschen will.
			getSubjectDAO().deleteById(sub.getId());
			subjects.remove(sub);
			sub = null;
		}
	}

Ich habe mir das Subject beim Aufruf der delete() ausgeben lassen. Beim ersten Mal wenn ich auf den Button drücke kommt null.
Beim 2. mal funktioniert das löschen. Wenn ich dann noch ein andres Subject löschen will, dann hat er immernoch die Referenz vom gelöschten Subject drin. Vermutlich, weil er eben beim ersten Klick auf den Button das Objekt nicht holt.
Aber warum...??

Danke für eure hilfe...
 

sence

Bekanntes Mitglied
versuch mal:

HTML:
<p:commandButton value="Delete" action="#{subjectService.delete(Subject)}" update=":form:sublist" />


Java:
public void delete(Subject p_subject) {      
    if(p_subject != null) {          
            getSubjectDAO().delete(p_subject);
            subjects.remove(p_subject);          
    }
}

als weitere Info:
du hast beim p:commandButton ein Attribut hinzugefügt "var" das es nicht gibt beim p:commandButton.
Der CommandButton ist nicht für iterationen von <iterateable> gedacht :- )
 
Zuletzt bearbeitet:

kiwie

Mitglied
hi,
danke erstmal :) nun bekommt er das Objekt beim ersten mal! allerdings geht das erst, wenn ich mal ein subject gespeichert habe...
aber nun kommt ne warnung das obj. wäre detached? warum??
die warnung kommt nicht, wenn ich mir das objekt zuvor über die id nochmal aus der DB hole. (kann ich die abfrage irgendwie umgehen, weil ichs nicht gut find dauernd auf die DB zugreifen zu müssen, so wegen performance)
schönen tag :)
 
Zuletzt bearbeitet:

kiwie

Mitglied
okay... wegen der serialisierung... weils über die tabelle geht und so?
also muss ich entweder mir das per id holen oder mit merge updaten?

hatte den beitrag gerade geändert als du geschrieben hast, hast du da auch eine idee??:
danke erstmal nun bekommt er das Objekt beim ersten mal! allerdings geht das erst, wenn ich mal ein subject gespeichert habe...
 

sence

Bekanntes Mitglied
>> die warnung kommt nicht, wenn ich mir das objekt zuvor über die id nochmal aus der DB hole
dann ist es ein reattached Objekt
(es wird wieder an die "Session / Transaktion" gebunden)

Irgendwo verlieren die Objekte den Bezug zur Transaktion (deattached)

Wie meinst du:
>>erst, wenn ich mal ein subject gespeichert habe...

Ich hatte die Funktion so designed, dass für das Löschen das Objekt nicht in deiner ManagedBean abgelegt (gespeichert) werden muss.
Es wird direkt aus der View, der Delete Funktion übergeben.
Zeig mir bitte mal was du mit "gespeichert" meinst
 

kiwie

Mitglied
unter der liste gibt es folgendes:

HTML:
<p:panel id="panel" header="Neues Fach" style="margin-bottom:10px;">  
         
        <h:panelGrid columns="3">  
            <h:outputLabel for="subjectName" value="Fach: *" />  
            <p:inputText id="subjectName"   
                value="#{subjectService.sub.subjectName}" required="true" label="subjectName">  
                <f:validateLength minimum="2" />  
            </p:inputText>  
            <p:message for="subjectName" />  
  
            <h:outputLabel for="studyCourse" value="Studiengang:" />  
            <p:inputText id="studyCourse"   
                value="#{subjectService.sub.studyCourse}" required="false" label="studyCourse"/>  
            <p:message for="studyCourse" />  
        </h:panelGrid>  
    </p:panel> 
    <p:commandButton value="Speichern" update="panel,sublist" id="ajax"  
             actionListener="#{subjectService.add()}" styleClass="ui-priority-primary"/>

mit dieser methode:

Java:
@Transactional(readOnly = false)
	public Subject add() {
		Subject result = getSubjectDAO().saveSubject(sub);
		getSubjectList();
		return result;
	}

die Liste wird aber per PostConstruct davor schon geholt:

Java:
@PostConstruct
	public void init(){
		subjects = new ArrayList<Subject>();
		subjects = getSubjectDAO().listSubject();
	}

so wie es aussieht wird die methode gar nicht aufgerufen, weil auch nicht die system.out.println(...); ausgegeben wird.
 

kiwie

Mitglied
ach ja ich habe mir die messages mal ausgeben lassen: da kommt dann:

"subjectName: Überprüfungsfehler: Wert ist erforderlich.subjectName: Überprüfungsfehler: Wert ist erforderlich."

das gehört glaub ich zu den input feldern vom speichern?? warum fragt er das ab, wenn ich doch nur löschen mag...
 

kiwie

Mitglied
okaaaay... ich hatte in dem inputtext ein required="true" drinnen... und das gilt dann anscheinend auch für andre komponenten, also übergreifend.
jetzt geht alles!
danke :)

ach ja mit merge hats irgendwie nicht geklappt, nur mit getById...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K jsf 1.2 tomahawk t:dataTable generic use Web Tier 3
W JSF DataTable - Filter Funktion funktioniert nicht Web Tier 3
W JSF einfache DataTable PrimeFaces Web Tier 1
F JSF h:dataTable fix Header und Scroll Body Web Tier 0
D JSF DataTable konvertiert Felder nicht Web Tier 1
G JSP dataTable header - Datenwerte verwenden? Web Tier 3
T JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite Web Tier 11
F Primefaces Datatable => Inplaces Web Tier 3
F Primefaces Datatable Web Tier 6
F.S.WhiTeY JSF h:dataTable / p:komponente Pagination mit Buchstaben. Web Tier 2
jottyfan JSF dataTable und graphicImage (mit JQuery) Web Tier 4
M JSF Composite components - dynamische dataTable? Web Tier 8
M JSF DataTable refreshen mit Ajax? Web Tier 5
M JSF Datatable, nichts geht ohne vorher zu refreshen... Web Tier 4
P JSF 1.2 commandButton in dataTable Web Tier 2
L JSF Überflüssige Methodenaufrufe - dataTable Web Tier 5
T DataTable Composite-Component und ManyToOne Web Tier 5
J JSF Datatable bestimmte Methode Web Tier 4
T JSF/Richfaces rich:dataTable with rich:datascroller Web Tier 1
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
O Focus auf Textfeld, in letzter Reihe einer dataTable Web Tier 2
M Frage zur Konfiguration einer RichFaces DataTable Web Tier 4
M Datatable und der Zurückbutton Web Tier 4
K JSF Tomahawk dataScroller mit dataTable Web Tier 4
Y dataTable als dynamisches Grid Web Tier 4
E JSF Datatable erst nach Buttonklick anzeigen Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
V JSF: dataTable Getter wird nie aufgerufen Web Tier 6
S JSF dataTable Position feststellen Web Tier 2
S JSF: colspan und rowspan in datatable Web Tier 4
E JSF Datatable leere Zellen anzeigen Web Tier 2
T richfaces datatable Web Tier 3
A JSF: Datatable Links mit Properties Web Tier 3
S richfaces Datatable horizontal ausgeben Web Tier 2
T JSF Primefaces: selectedvalue von "selectmanyCheckbox" geht verloren Web Tier 0
M fileUploadListener geht nicht wenn Element zur Laufzeit gerendert wird Web Tier 2
Phash Link geht nicht Web Tier 4
C JSON-Antwort an Javascript geht nicht Web Tier 7
D JSP Programm geht einfach nicht in If-Schleife rein Web Tier 7
F Web-Projekt als LIB - wie geht das? Web Tier 7
J error-page geht nicht Web Tier 12
P Simpler HTTP-Container in JBOSS - Geht das? Web Tier 8
R Felder nicht anzeigen lassen! Wie geht das? Web Tier 4
F sendError geht nicht richtig, seite leer Web Tier 6

Ähnliche Java Themen

Neue Themen


Oben