【问题标题】:Primefaces datatable with delete button not working带有删除按钮的 Primefaces 数据表不起作用
【发布时间】:2015-07-23 18:07:29
【问题描述】:

我正在尝试使用<p:commandButton> 删除一个单元格,单击后我想更新我的表格。但所发生的一切是,我得到了这个异常。

 javax.persistence.EntityNotFoundException: Unable to find de.test.Datei with id 5

但在我的数据库中,我可以看到每个表中的事实。此外,当我单击按钮时,日期将被正确删除。但是我的表格没有更新,所以单元格没有消失。当我单击两次时,我收到了上述错误消息。

Datei.class

@Entity
public class Datei implements Serializable {


private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name = "DATA_ID_GENERATOR", sequenceName = "SEQ_DATA", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DATA_ID_GENERATOR")
private long id;
private String name;
private long groesse;
@Temporal(TemporalType.TIMESTAMP)
private Date datum;
@Basic(fetch = FetchType.LAZY)
@Lob
private byte[] datei;
@ManyToOne
private Benutzer benutzer;

public Benutzer getBenutzer() {
    return benutzer;
}

public void setBenutzer(Benutzer benutzer) {
    this.benutzer = benutzer;
}

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;
}

public long getGroesse() {
    return groesse;
}

public void setGroesse(long groesse) {
    this.groesse = groesse;
}

public byte[] getDatei() {
    return datei;
}

public void setDatei(byte[] datei) {
    this.datei = datei;
}

public Datei() {
    // TODO Auto-generated constructor stub
}

public Date getDatum() {
    return datum;
}

public void setDatum(Date datum) {
    this.datum = datum;
}


@Override
public String toString() {
    return "Datei [id=" + id + ", name=" + name + ", groesse=" + groesse
            + ", datum=" + datum + ", datei=" + Arrays.toString(datei)
            + "]";
}

}

Benutzer.class

@Entity
public class Benutzer implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name = "CUSTOMER_ID_GENERATOR", sequenceName = "SEQ_CUSTOMER", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_ID_GENERATOR")
private long id;
private String name;
private String email;
private long kundennummer;
@OneToMany(mappedBy = "benutzer", orphanRemoval = true)
private List<Datei> datei;

@Override
public String toString() {
    return "Benutzer [id=" + id + ", name=" + name + ", email=" + email
            + ", kundennummer=" + kundennummer + ", datei=" + datei + "]";
}

public List<Datei> getDatei() {
    return datei;
}

public void setDatei(List<Datei> datei) {
    this.datei = datei;
}

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;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public long getKundennummer() {
    return kundennummer;
}

public void setKundennummer(long kundennummer) {
    this.kundennummer = kundennummer;
}

public Benutzer() {
    // TODO Auto-generated constructor stub
}

}  

我的 DateiDAO.class

[...]
 public void loeschen(Datei datei, Benutzer benutzer) {

    EntityManager em = emf.createEntityManager();
    EntityTransaction tr = em.getTransaction();

    tr.begin();
    benutzer = em.merge(benutzer);
    datei = em.merge(datei);
    tr.commit();

    benutzer.getDatei().remove(datei);

    tr.begin();
    em.merge(benutzer);
    em.remove(em.merge(datei));
    tr.commit();
}

所以唯一的问题是,我的表格没有更新。 如果我使用richfaces,它工作正常。

main.xhtml

<h:form id="myForm">
        <p:dataTable id="dateien" var="data"
                value="#{mainController.ben.datei}" rowKey="#{data.id}"
                selectionMode="single" rows="5" paginator="true" rowsPerPageTemplate="5,10,15" paginatorPosition="bottom"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
                <f:facet name="header">
                    <h:outputText value="Uploaded"/>
                </f:facet>
                <p:column headerText="Id">
                    <h:outputText value="#{data.id}" />
                </p:column>
                <p:column headerText="Name">
                    <h:outputText value="#{data.name}" />
                </p:column>
                <p:column headerText="Datum">
                    <h:outputText value="#{data.datum}" />
                </p:column>
                <p:column headerText="Delete">
                    <p:commandButton update="myForm"
                        actionListener="#{mainController.loeschen(data)}"
                        icon="ui-icon-trash" />
                </p:column>
            </p:dataTable>
        </h:form>

【问题讨论】:

    标签: jsf primefaces managed-bean


    【解决方案1】:

    在你的过程中错过它:

    在您从数据库中删除项目后,从您的 ma​​inController.ben.datei 列表中删除该项目,并像 Ouerghi Yassine 所说的那样更新您的 dataTable。

    在您删除项目后,使用 loeschen 方法再次从数据库中加载您的数据列表,如果您使用此系统并希望没有并发问题,则更安全。

    因此,您向您的 dataTable 提供一个与您的 bean 绑定的列表,在您的情况下为 datei 列表,因此即使您从数据库中删除项目,该项目也不能是此列表。

    对不起我的英语。

    【讨论】:

      【解决方案2】:

      将 update="dateien" 添加到您的命令按钮

      <p:commandButton update="myForm"
                       actionListener="#{mainController.loeschen(data)}"
                       icon="ui-icon-trash" 
                       update="dateien"/>
      

      【讨论】:

      • 感谢您的提示,但它不起作用。还是同样的问题。数据库中的数据被删除,但表没有更新
      • 我看不到您是如何检索“datei”列表的,但是一旦您删除了该项目,您也必须更新它
      猜你喜欢
      • 2021-12-14
      • 2022-01-19
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2023-03-24
      • 2017-11-27
      • 1970-01-01
      相关资源
      最近更新 更多