# deleteButton in dataTable geht nur halb



## kiwie (30. Sep 2013)

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:


```
<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:

```
@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 (1. Okt 2013)

versuch mal:


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



```
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 :- )


----------



## kiwie (2. Okt 2013)

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


----------



## sence (2. Okt 2013)

Detaching and Merging JPA Entity Objects

vielleicht kommst du selbst drauf 
vg


----------



## kiwie (2. Okt 2013)

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 (2. Okt 2013)

>> 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 (2. Okt 2013)

unter der liste gibt es folgendes:


```
<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:


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

die Liste wird aber per PostConstruct davor schon geholt:


```
@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 (2. Okt 2013)

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 (2. Okt 2013)

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...


----------

