DataTable mit Editabel - Werte lassen sich nicht editieren

Hallo,

ich verwende die Primefaces DataTable und habe mehr oder weniger fast den gleichen Code wie im http://www.primefaces.org/showcase-labs/ui/datatableCellEditing.jsf;jsessionid=i50jy2ma3ihv1gmjgzkd0us6f ShowCase. So siehts bei mri aus:

  <h:form id="IngredientsForm">
                    <fieldset id="createingredients">

                        <legend>Zutat erstellen</legend>
                        <h:outputLabel for="ingredient" value="Zutat name" /> 
                        <h:inputText  id="ingredient" binding="#{ingredientInputText}" required="true" />
                        <p:commandButton action="#{IngredientBean.addIngredient(ingredientInputText.value)}" value="Zutat hinzufügen" update="IngredientsForm">
                            <!-- 
                             todo zu inputText validaotr einbauen der überprüft ob rezept bereits exisitier und dann commandButton disablen!
                            -->

                        </p:commandButton>  

                    </fieldset>

                    <fieldset>
                        <legend>Zutaten suche</legend>

                        <p:dataTable id="dataTable" var="ingredient" value="#{IngredientBean.ingredients}" scrollRows="20" scrollable="true" liveScroll="true" 
                                     widgetVar="ingredientTable" editable="true" editMode="cell"  scrollHeight="150">  
                            <p:ajax event="cellEdit" listener="#{IngredientBean.onCellEdit}" update=":IngredientsForm" />  
                            <p:column headerText="name">  
                                <p:cellEditor>  
                                    <f:facet name="output"><h:outputText value="#{ingredient.name}" /></f:facet>  
                                    <f:facet name="input"><p:inputText id="ingredientname" value="#{ingredient.name}"/></f:facet>  
                                </p:cellEditor>  
                            </p:column>  
    </p:dataTable> 

                    </fieldset>
                </h:form>

Wenn ich jetzt den Wert bei ingredient.name ändere springt dieser wieder auf den alten Wert zurück und auch wenn ich am Debuggen bin und mir die Werte vom Parameter der onCellEdit Methode anschaue liefern old- als auch newValue die exakten Werte zurück. Hat jemand eine Ahnung woran das liegen kann? Fehlermeldungen gibt er auch keine aus. Ich bin momentan ziemlich Ratlos was ich noch versuchen könnte.

Hi mfe_,

ich würde erst mal versuchen, das Beispiel weiter zu vereinfachen. Was sagt denn dein Debugger zu den übergebenen Values, wenn du in deinem AJAX-Event das update rauswirfst? Musst du überhaupt bei einem Edit das gesamte Form updaten?

Gruß,
Tim

Ich habe das Beispiel jetzt vereinfacht und auch ein einfacheres Datenmodel genommen. Das zu bearbeitende Objekt heißt Measurement und hat die Property Name.

 <h:form id="MeasurementForm">
                    <fieldset id="createMeasurement">

                        <legend>Messeinheit erstellen</legend>
                        <h:outputLabel for="measurementadd" value="Messeinheit name" /> 
                        <h:inputText  id="measurementadd" binding="#{MeasurementInputText}" required="true" />
                        <p:commandButton action="#{MeasurementBean.addMeasurement(MeasurementInputText.value)}" value="Messeinheit hinzufügen" update="MeasurementForm"><commandButton>  

                    </fieldset>

                    <fieldset>
                        <legend>Messeinheit suche</legend>

                        <p:dataTable id="dataTable" var="measurement" value="#{MeasurementBean.measurements}" scrollRows="20" scrollable="true" liveScroll="true" 
                                     widgetVar="measurementTable" editable="true" editMode="cell"  scrollHeight="150">  

                            <p:column headerText="name">  
                                <p:cellEditor>  
                                    <f:facet name="output"><h:outputText value="#{measurement.name}" /></f:facet>  
                                    <f:facet name="input"><p:inputText id="measurementname" value="#{measurement.name}" ></p:inputText></f:facet>  
                                </p:cellEditor>  
                            </p:column>  

                            <p:column headerText="löschen">  
                                <p:commandButton action="#{MeasurementBean.removeMeasurement(measurement)}" update="dataTable" value="löschen" />
                            </p:column>  

                        </p:dataTable> 
                        <h:messages globalOnly="true" />

                    </fieldset>
@ManagedBean(name = "MeasurementBean")
@ViewScoped
public class MeasurementBean {

    /**
     * Creates a new instance of MeasurementBean
     */
    public MeasurementBean() {
    }

    public void addMeasurement(String name) {

        try {
            Measurement measurement = new Measurement(name);
            MeasurementEM.create(measurement);
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
        }

    }
        public void removeMeasurement(Measurement measure) {

        if (measure == null) {
            return;
        }

        try {
            MeasurementEM.remove(measure);
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
        }
    }

    /**
     * Get all saved Ingredient
     *
     * @return
     */
    public List<Measurement> getMeasurements() {
        return getMeasurementEM().findAll();
    }
    @EJB
    private MeasurementFacadeLocal MeasurementEM;

    /**
     * Get the value of MeasurementEM
     *
     * @return the value of MeasurementEM
     */
    public MeasurementFacadeLocal getMeasurementEM() {
        return MeasurementEM;
    }

    /**
     * Set the value of MeasurementEM
     *
     * @param MeasurementEM new value of MeasurementEM
     */
    public void setMeasurementEM(MeasurementFacadeLocal MeasurementEM) {
        this.MeasurementEM = MeasurementEM;
    }

Das hinzufügen / erstellen von neuen Measurement Objekten klappt. Die Bean Methode addMeasurement erhält den richtigen Parameter und die DataTable wird gleich aktualisiert. Jetzt habe ich den Lösch Button zur DataTable hinzugefügt um Objekte in der Liste auch löschen zu könnnen. Wenn ich darauf klicke passiert aber nichts. Ich habe auch schon statt action="#{MeasurementBean.removeMeasurement(measurement)}" action="#{MeasurementBean.removeMeasurement}" probiert und das update Attribute weggelassen. Im Response Headers steht auch nichts was mir weiter helfen würde :frowning:

Hi,

was heißt denn “passiert nichts”, auf der GUI oder im Debugger? Also, läuft er gar nicht erst in die Methode?
Das Feld “MeasurementEM” solltest du übrigens “measurementEM” nennen.

Gruß,
Tim

[QUOTE=inv_zim;74108]Hi,

was heißt denn “passiert nichts”, auf der GUI oder im Debugger? Also, läuft er gar nicht erst in die Methode?
Das Feld “MeasurementEM” solltest du übrigens “measurementEM” nennen.
[/QUOTE]

Ja, er geht im Debugger nicht in die Methode. Die Weboberfläche bleibt auch unverdänert.

Kannst du mit Entwicklertools vom Browser eventuell AJAX Fehler sehen? Welche IDE benutzt du, Netbeans hilft hier ab Version 7.3 mit einem Browser-Plugin. Steht etwas im Server-Log?

Ich verwende Netbeans 7.3.1 unter Debian mit GL 4.0. Wie heißt das FireFox addon für Netbeans? Ich finde nur eines das für PHP Debugging ist.

Ich habe mir den erzeugten HTML Code vom löschen Button angeschaut


<button id="MeasurementForm:dataTable:0:j_idt22" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" type="submit" onclick="PrimeFaces.ab({source:'MeasurementForm:dataTable:0:j_idt22'});return false;" name="MeasurementForm:dataTable:0:j_idt22" role="button" aria-disabled="false"> … </button>

Dann habe ich im Iceweasel im Debugger bzw. in der Konsole PrimeFaces.ab({source:‘MeasurementForm:dataTable:0:j_idt22’}); ausgeführt und erhalte:

[13:20:00.525] PrimeFaces.ab({source:‘MeasurementForm:dataTable:0:j_idt22’});
[13:20:00.528] undefined
[13:20:00.583] POST http://localhost:8080/wie-koche-ich/edit/measurement/ [HTTP/1.1 200 OK 138ms]

Scheint so als würde die PrimeFaces JS Bibliothek fehlen wegen dem undefined? Aber im Network Tab wird die primefaces.js.jsf=?ln=primefaces als geladen angezeigt.

Hi,

was ich dir gerade schon mal sagen kann, ist dass das undefined nichts bedeutet, das dürfte einfach das (nicht vorhandene) returnvalue der JS Funktion sein.
Ich habe im Chrome ein Netbeans Plugin integriert, ob es etwas vergleichbares für Firefox gibt, weiß ich gerade nicht.

Des Weiteren habe ich deinen Code mal nachgebaut und in ein Test-Projekt gepackt:

MeasurementBean (die sollte bei dir auch Serializable sein! Das erklärt aber nicht dein Problem)

@ViewScoped
public class MeasurementBean implements Serializable {

    public List<Measurement> measurements;

    public MeasurementBean() {
        FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        measurements = new ArrayList<Measurement>();

        for (int i = 0; i < 100; i++) {
            measurements.add(new Measurement());
        }
    }

    public void remove(Measurement measurement) {
        System.out.println("Klappt doch!");
    }

    public List<Measurement> getMeasurements() {
        return measurements;
    }

    public void setMeasurements(List<Measurement> measurements) {
        this.measurements = measurements;
    }
}```


    <h:form>
        <p:dataTable 
            id="dataTable" 
            var="measurement" 
            value="#{measurementBean.measurements}" 
            scrollRows="20" 
            scrollable="true" 
            liveScroll="true"
            widgetVar="measurementTable" 
            editable="true" 
            editMode="cell"  
            scrollHeight="150">  

            <p:column headerText="name">  
                <p:cellEditor>  
                    <f:facet name="output">
                        <h:outputText value="#{measurement.name}" />
                    </f:facet>  
                    <f:facet name="input">
                        <p:inputText id="measurementname" value="#{measurement.name}" />
                    </f:facet>  
                </p:cellEditor>  
            </p:column>  

            <p:column headerText="löschen">  
                <p:commandButton action="#{measurementBean.remove(measurement)}" update="dataTable" value="löschen" />
            </p:column>  

        </p:dataTable>
        <h:messages globalOnly="true" />
        
    </h:form>


Bei mir funktioniert der Aufruf einwandfrei, ich habe keine Probleme.
Du bist sicher, dass du im Server Log keine Bugs hast? 

Gruß,
Tim

Hallo,

ich habe jetzt viel probiert, angefangen die Measurement Klasse quasi das Datenmodel neu zu erstellen, die View noch mehr zu vereinfachen usw. usf. Dein Code hat natürlich funktioniert :slight_smile: Danke dir!

Das löschen funktioniert jetzt endlich so weit.

                        <p:dataTable 
                            id="dataTable" 
                            var="measurement" 
                            value="#{MeasurementBean.measurements}" 
                            scrollRows="20" 
                            scrollable="true" 
                            liveScroll="true"
                            widgetVar="measurementTable" 
                            editable="true" 
                            editMode="cell"  
                            scrollHeight="150">  
                            
                            <p:ajax event="cellEdit" listener="#{MeasurementBean.onCellEdit}"  />  
                            
                            <p:column headerText="name">  
                                <p:cellEditor>  
                                    <f:facet name="output">
                                        <h:outputText value="#{measurement.name}" />
                                    </f:facet>  
                                    <f:facet name="input">
                                        <p:inputText id="measurementname" value="#{measurement.name}" >
                                            <p:ajax event="blur" listener="#{MeasurementBean.save(measurement)}" />
                                        </p:inputText>
                                    </f:facet>  
                                </p:cellEditor>  
                            </p:column>  

                            <p:column headerText="löschen">  
                                <p:commandButton action="#{MeasurementBean.remove(measurement)}" update="dataTable" value="löschen" />
                            </p:column>  

                        </p:dataTable>
                        <h:messages globalOnly="true" />

Ich habe also deinen View Code genommen, die Bean Klasse ist noch die alte von mir. Ich habe ledeglich noch ein Serializable (das fehlen des Serializable war nicht der Grund warum das löschen nicht funktioniert hat) und die onCellEdit Methode in mein Bean hinzugefügt.

Beim editieren erhalte ich aber nach wie vor nur den alten Wert. Also bei der

    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if (newValue != null && !newValue.equals(oldValue)) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

Methode sind oldValue und newValue gleich. Positiv ist aber schon mal, dass er im Debugger wenigstens reinspringt. Bei der Save Methode bekomme ich auch nur das Measurement Objekt mit dem „oldvalue“. Ich schau jetzt mal ob das an der Entity Klasse Measurement liegt, weil die Property „name“ das Attribute @Id trägt. Villeicht lässt sich deshalb der Wert nicht ändern.

Das Editieren habe ich auch bei mir noch einmal eingebaut (dein letzter Code-Block, Copy & Paste), da bekomme ich bei OldValue und bei NewValue zwei unterschiedliche Werte, nämlich den alten und den neuen.

Das Feld “name” trägt bei dir die @Id Annotation und ist in der DB der Primärschlüssel? Das dürfte in diesem Fall hier zwar nichts ausmachen, aber das willst du ändern? Das macht deine JPA-Implementierung im Hintergrund garantiert nicht mit…

[QUOTE=inv_zim;74390]

Das Feld „name“ trägt bei dir die @Id Annotation und ist in der DB der Primärschlüssel? Das dürfte in diesem Fall hier zwar nichts ausmachen, aber das willst du ändern? Das macht deine JPA-Implementierung im Hintergrund garantiert nicht mit…[/QUOTE]

Ja, und da man den Primärschlüssel nicht einfach „updaten“ kann muss ich dafür ein neues Objekt anlegen und das alte löschen. Deshalb benötige ich auch die alten/neuen Werte. Hat die Measurement Klasse keine id Annotation bei name erhalte ich den neuen Wert. Es scheint also wirklich an der Entity Klasse zu liegen bei der die Propertie name die Id ist.

Für dieses Problem hätte ich folgenden Workaround. Ich übergebe der Save Methode nicht den Wert vom Measurement.name sondern vom inputText.value.

Ich erhalte jedoch dazu folgende Exception:

java.lang.String cannot be cast to javax.faces.component.UIComponent

Aber eigentlich sollte es doch so gehen:

   <p:column headerText="name">  
                                <p:cellEditor>  
                                    <f:facet name="output">
                                        <h:outputText value="#{measurement.name}" />
                                    </f:facet>  
                                    <f:facet name="input">
                                        <p:inputText id="measurementname" value="#{measurement.name}" binding="inputTextName" >
                                            <p:ajax event="blur" listener="#{MeasurementBean.save(inputTextName.value)}" />
                                        </p:inputText>
                                    </f:facet>  
                                </p:cellEditor>  
                            </p:column>  
    public void save(Object measure) {
        System.out.println("save doch!");

    }

Ich habe den DatenTyp vom Parameter der save Methode von Measurement auf Object abgeändert, deshalb verstehe ich nicht warum ich trotzdem die Exception erhalte.

Wieso hast du den Parameter auf Object abgeändert, was für ein Datentyp soll da ankommen? Was für einer kommt an?
Die Exception fliegt direkt, wenn du speichern möchtest? Das mit dem Binding erschließt sich mir auch nicht, das würde ich generell nur benutzen um Komponenten programmatisch zu bearbeiten. Außerdem sollte sich das Binding auf ein Feld in deiner MeasurementBean beziehen, lies dir dazu mal das hier durch: http://stackoverflow.com/questions/4532955/what-is-the-advantages-of-using-binding-attribute-in-jsf#4532971
Ich verstehe seit deinem letzten Post ehrlich gesagt nicht, was du versuchst. Dein Problem mit dem @Id annotierten Feld lässt sich nur auf eine Art lösen: Die Entities ordentlich designen. Primärschlüssel sollte ein Integer oder Long sein, der nichts mit den Daten zu tun hat. Alles andere ist in diesem Fall Bastelei.

Eigentlich hätte der String bzw. der value vom InputText ankommen sollen. Mein Fehler war, dass ich die #{} vergessen habe zu verwenden. Jetzt geht auch wieder das Aufrufen der Seite.

Ich verstehe seit deinem letzten Post ehrlich gesagt nicht, was du versuchst. Dein Problem mit dem @Id annotierten Feld lässt sich nur auf eine Art lösen: Die Entities ordentlich designen. Primärschlüssel sollte ein Integer oder Long sein, der nichts mit den Daten zu tun hat. Alles andere ist in diesem Fall Bastelei.

Ich muss mir das jetzt nochmal überlegen wie ich das angehe, weil das Editieren der Eigenschaft name ohne die @Id annotation trotzdem nicht geht. Jedenfalls gibt es wie ich gesehen habe in JPA2 ein unique java - Using unique constraint on Hibernate JPA2 - Stack Overflow .

Da das Primefaces Beispiel fehlerhaft ist werde ich jetzt ein weiteres vereinfachtes Projekt anlegen um das editieren mit Datatables zu testen.

Interessant ist ja auch folgendes Verhalten:

                        <p:growl id="messages" showDetail="true"/> 
                        <p:dataTable 
                            id="dataTable" 
                            var="measurement" 
                            value="#{MeasurementBean.measurements}"                  >  
                            <p:ajax event="cellEdit" listener="#{MeasurementBean.onCellEdit}" update=":form:messages"   />  
                            [...]
                            <p:column headerText="löschen">  
                                <p:commandButton action="#{MeasurementBean.remove(measurement)}" update="dataTable" value="löschen"/ >

                            </p:column>  

                        </p:dataTable>

So funktioniert der löschen Button nicht. Weder der Debugger springt in die Funktion noch wird etwas im GlassFish Log angezeigt.

Lösche ich aber aus dem <p:ajax event=“cellEdit” listener="#{MeasurementBean.onCellEdit}" /> das Attribut update=":form:messages", funktioniert der Button wieder.

Ist wohl ein Bug?.

Ich gehe nicht davon aus, dass du einen Bug gefunden hast. Hat dein Form was du updaten möchtest wirklich die id “form”? Weiter oben hieß es noch anders.

Ja ich habe es mittlerweile wieder abgeändert.

Das war auch der Grund warum Anfangs der Löschbutton http://forum.byte-welt.net/threads/10712-DataTable-mit-Editabel-Werte-lassen-sich-nicht-editieren?p=74385&viewfull=1#post74385 nicht funktioniert hat. Nach dem ich deinen Code übernommen hatte, war mir nicht klar was der Fehler für dieses Verhalten war.

So, ich habe jetzt das Beispiel so weit wie möglich vereinfacht.

Einmal habe ich ein Bean der eine erzeugte List an die DataTable zurückgibt. Dort funktioniert das mit dem old/new Value in der OnCellEdit Funktion.

Im anderen Bean wird die List aus der DB geholt welche die DataTable verwendet. Dort funktioniert das aktualisieren mit dem OnCellEdit nicht. Er springt zwar in die onCellEdit Methode aber event.getOldValue und getNewValue sind ident. Es steht auch nichts in den Logs. Die Views sind komplett ident bis auf die verwendeten Beans.

Hier noch der Code:
Aktualisierung funktioniert:



import Get.Model.Measurement;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;

import javax.faces.context.FacesContext;
import org.primefaces.event.CellEditEvent;

@ManagedBean
public class TableBean implements Serializable {

    @PostConstruct
    public void init() {

        if (getMeasurementEM().findAll().isEmpty()) {
            this.getMeasurementEM().create(new Measurement("martin"));
            this.getMeasurementEM().create(new Measurement("kathi"));
            this.getMeasurementEM().create(new Measurement("stefan"));
        }

    }
    @EJB
    private MeasurementFacadeLocal MeasurementEM;

    public List<Measurement> getMeasurement() {
        return getMeasurementEM().findAll();
    }

    /**
     * Get the value of MeasurementEM
     *
     * @return the value of MeasurementEM
     */
    public MeasurementFacadeLocal getMeasurementEM() {
        return MeasurementEM;
    }

    /**
     * Set the value of MeasurementEM
     *
     * @param MeasurementEM new value of MeasurementEM
     */
    public void setMeasurementEM(MeasurementFacadeLocal MeasurementEM) {
        this.MeasurementEM = MeasurementEM;
    }

    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if (newValue != null && !newValue.equals(oldValue)) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
}

Aktualisierung funktioniert nicht:



import Get.Model.Measurement;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;

import javax.faces.context.FacesContext;
import org.primefaces.event.CellEditEvent;

@ManagedBean
public class TableBean_no_Entity_Model implements Serializable {

    @PostConstruct
    public void init() {
        this.setMeasurements(new ArrayList<Measurement>());

        this.getMeasurements().add(new Measurement("martin"));
        this.getMeasurements().add(new Measurement("kathi"));
        this.getMeasurements().add(new Measurement("stefan"));
    }
    private List<Measurement> Measurements;

    /**
     * Get the value of Measurement
     *
     * @return the value of Measurement
     */
    public List<Measurement> getMeasurements() {
        return Measurements;
    }

    /**
     * Set the value of Measurement
     *
     * @param Measurement new value of Measurement
     */
    public void setMeasurements(List<Measurement> Measurement) {
        this.Measurements = Measurement;
    }

    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if (newValue != null && !newValue.equals(oldValue)) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
}

Die 2 View’s unterscheiden sich ledeglich von den verwendeten Beans. Einmal mit tableBean und einmal mit tableBean_no_Entity_Model:

 <h:form id="form">  

            <p:growl id="messages" showDetail="true"/>  


            <p:dataTable id="cars" var="measurement" value="#{tableBean.measurement}" editable="true" editMode="cell" widgetVar="carsTable">  

                <f:facet name="header">  
                    In-Cell Editing  
                </f:facet>  

                <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":form:messages" />  

                <p:column headerText="Model" style="width:25%">  
                    <p:cellEditor>  
                        <f:facet name="output"><h:outputText value="#{measurement.name}" /></f:facet>  
                        <f:facet name="input"><p:inputText id="modelInput" value="#{measurement.name}" style="width:96%"/></f:facet>  
                    </p:cellEditor>  
                </p:column>  



            </p:dataTable>  


        </h:form>  

Ich habe das Entity Model Measurement auch dahin gehend geändert, dass ich eine Property Id als Primarykey hinzugefügt habe und name nur noch eine normale Property ist.
Hier nochmal der komplette Code:
Aufruf: http://localhost:8080/DataTableCellEdit/index_1.jsf (tableBean_no_Entity_Model ohne Entity Model) und http://localhost:8080/DataTableCellEdit/index.jsf (tableBean mit Entity Model)

Ich bin mit meinem Latein am Ende :frowning:

Jetzt ohne es selbst ausführen zu können gerade wirklich eine harte Nuss.
Kannst du mir mal den Code der “equals” Methode deiner Measurement Entity zeigen?

Übrigens ist das Beispiel auf der Primefaces Seite wirklich deprecated: Man sollte einen Table eigentlich nicht aus einer Collection befüllen, sondern aus einem Datamodel.

[QUOTE=inv_zim;76568]
Kannst du mir mal den Code der “equals” Methode deiner Measurement Entity zeigen?

Übrigens ist das Beispiel auf der Primefaces Seite wirklich deprecated: Man sollte einen Table eigentlich nicht aus einer Collection befüllen, sondern aus einem Datamodel.[/QUOTE]

In der angehängten Zip, wird im Model in der Equals Methode noch die Property name als vergleich verwendet. Ich habe das jetzt schnell bei mir umgeändert.

Hier der Code:

package Get.Model;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.UniqueConstraint;
import javax.persistence.Table;

/**
 *
 * @author martin
 */
@Entity
@Table(name = "c_measurement", uniqueConstraints = @UniqueConstraint(columnNames = {"name"}))
public class Measurement implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(length = 100)
    private String name;
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    public Measurement() {
    }

    public Measurement(String name) {
        this();
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    /**
     * g,kg,dash of salt...
     */
    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

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

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Measurement)) {
            return false;
        }
        Measurement other = (Measurement) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "GTS.Model.Measurement[ id=" + id + " ]";
    }
}

Die Änderung hatte aber keine Auswirkungen auf das Fehlverhalten von der DataTable. Sprich das Problem ist noch das gleiche.

Falls jemand das gleiche Problem hat:

Ein Workaround wäre einen ValueChangeListener beim inputText zu verwenden.