Ошибка, освежив таблицу в XHTML (Примефасес Хававеб)

У меня есть проблема, загрузив таблицу с базы данных в MySQL. Таблица находится в PrimeFaces и загружает данные о базе данных, когда я разворачиваю приложение. Но когда я изменяю информацию, несмотря на то, что он это загружает в базе данных он это не показывает в таблице.

Изданный

Здесь что-то из кода. я не функционирует со свойством освежать посредством commandbutton.

<p:panel id="tabla" style="width: 100% ; font-size: small; text-align: left ; border : none ;"  > 
    <p:dataTable style="border : none ;"
                 id="tablePro" var="programacion" value="#{mantenimientoTvista.listaProgramaciontodo}" rows="10"
                 paginator="true"
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                 rowsPerPageTemplate="5,10,15"
                 filteredValue="#{mantenimientoTvista.listaProgramaciontodo}"
                 emptyMessage="No se encontraron resultados"
                 selectionMode="single"
                 rowKey="#{programacion.idprogramacion}"
                 selection="#{mantenimientoTvista.programacionSeleccionado}"
                 >
        <p:ajax event="rowSelect" listener="#{mantenimientoTvista.funcionSeleccionarProd}" update="forma:growl ,:forma:campos" />

        <p:column headerText="nombre tecnico" width="30" filterBy="#{programacion.documentotecnico.personal.nombrepersonal}">
            <h:outputText value="#{programacion.documentotecnico.personal.nombrepersonal}"/>
        <p:column headerText="Tipo mant" width="5" filterBy="#{programacion.idclase.clasenombre}" filterMatchMode="contains">
            <h:outputText value="#{programacion.idclase.clasenombre}"/>
        </p:column>      
    </p:dataTable>

</p:panel>

и это кнопка я оставляю код здесь отдельным----------------------------------------

и здесь код value listaidtecnicos (я опустил много колонн, чтобы не прикреплять слишком пространный одинокий код мне нужно, чтобы освежилось имя техника, когда я это меняю на таблицу).

Это класса организация начиная с базы данных.

@Entity
@Table(name = "personal")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Personal.findAll", query = "SELECT p FROM Personal p"),
    @NamedQuery(name = "Personal.findByDocumentopersonal", query = "SELECT p FROM Personal p WHERE p.documentopersonal = :documentopersonal"),
    @NamedQuery(name = "Personal.findByApellidopersonal", query = "SELECT p FROM Personal p WHERE p.apellidopersonal = :apellidopersonal"),
    @NamedQuery(name = "Personal.findByClavepersonal", query = "SELECT p FROM Personal p WHERE p.clavepersonal = :clavepersonal"),
    @NamedQuery(name = "Personal.findByNombrepersonal", query = "SELECT p FROM Personal p WHERE p.nombrepersonal = :nombrepersonal")})
public class Personal implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "documentopersonal")
    private Long documentopersonal;
    @Size(max = 255)
    @Column(name = "apellidopersonal")
    private String apellidopersonal;
    @Size(max = 255)
    @Column(name = "clavepersonal")
    private String clavepersonal;
    @Size(max = 255)
    @Column(name = "nombrepersonal")
    private String nombrepersonal;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "personal")
    private Administrador administrador;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "personal")
    private Tecnicos tecnicos;

    public Personal() {
    }

    public Personal(Long documentopersonal) {
        this.documentopersonal = documentopersonal;
    }

    public Long getDocumentopersonal() {
        return documentopersonal;
    }

    public void setDocumentopersonal(Long documentopersonal) {
        this.documentopersonal = documentopersonal;
    }

    public String getApellidopersonal() {
        return apellidopersonal;
    }

    public void setApellidopersonal(String apellidopersonal) {
        this.apellidopersonal = apellidopersonal;
    }

    public String getClavepersonal() {
        return clavepersonal;
    }

    public void setClavepersonal(String clavepersonal) {
        this.clavepersonal = clavepersonal;
    }

    public String getNombrepersonal() {
        return nombrepersonal;
    }

    public void setNombrepersonal(String nombrepersonal) {
        this.nombrepersonal = nombrepersonal;
    }

    public Administrador getAdministrador() {
        return administrador;
    }

    public void setAdministrador(Administrador administrador) {
        this.administrador = administrador;
    }

    public Tecnicos getTecnicos() {
        return tecnicos;
    }

    public void setTecnicos(Tecnicos tecnicos) {
        this.tecnicos = tecnicos;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (documentopersonal != null ? documentopersonal.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 Personal)) {
            return false;
        }
        Personal other = (Personal) object;
        if ((this.documentopersonal == null && other.documentopersonal != null) || (this.documentopersonal != null && !this.documentopersonal.equals(other.documentopersonal))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.simap.modelo.Personal[ documentopersonal=" + documentopersonal + " ]";
    }        

}
3
задан 10.06.2016, 18:49
4 ответа

Это достаточно проблемы часто посещает и я беспокою. Это называется stale data. В общем, происходи, когда ты не действуешь внутри сделки, и EntityManager использует в обысканную версию консультации. У тебя есть несколько выборов.

EntityManager#refresh

Звоня в метод refresh EntityManager ты освежаешь состояние организации, заставляя, что получил всегда последнюю версию того же самого.

em.refresh(objeto);

EntityManagerFactory#getCache#evictAll

Другой выбор состоит в том, чтобы звонить в метод getCache() EntityManagerFactory и отлаживать разбило ее посредством evictAll(), перед тем, как получать реестры.

em.getEntityManagerFactory().getCache().evictAll();

Использовать сделку

Это более рекомендуемое. Ты не комментируешь, есть ли у тебя сервер full profile или одинокий контейнер servlets как Tomcat или Jetty. Однако, с обоими ты можешь реализовывать твои консультации в сделках.

Jetty или Tomcat

EntityTransaction tx = null;
try {
    tx = em.getTransaction();
    tx.begin(); // empiezas la transacción
    // tu lógica aquí
    tx.commit(); // finalizas la transacción
} catch (PersistenceException e) {
    // si algo sale mal, hacemos rollback para revertir cambios
    if(tx != null && tx.isActive()) {
       tx.rollback();
    }
} finally {
    em.close();
}

WildFly, GlassFish, и т.д.

В этом типе серверов ты не нуждаешься в предыдущем, потому что уже этим манипулируют они посредством JTA. Например, твои услуги могут быть EJB's, которые - связаны со сделкой, чтобы делать твою логику.

@Stateless
@LocalBean
public class UsuarioService implements Serializable {

   @PersistenceContext
   private EntityManager em;

   public List<Usuario> listar() {
       TypedQuery<Usuario> query = em.createNamedQuery(Usuario.FIND_ALL, Usuario.class);
       return query.getResultList();
   }
}

Также ты можешь дезактивировать кэш твоего поставщика в persistence.xml:

<shared-cache-mode>NONE</share-cache-mode>

Наоборот, если то, что у тебя есть, является проблемой освежения данных, обрати внимание, чем в признаке update commandButton ты помещаешь один пойдите действительно. Помни, что, если элемент, который нужно обновлять, - вне формуляра, ты, должно быть, предпочитаешь : в id. Например:

<p:commandButton actionListener="#{tuBean.metodo()}" update=":tabla" />

Обновление

Я не видел ни из-за какой стороны ты commandButton, то, что я вижу, является listener для выбора линий. В этом listener у тебя есть запятая () что не было бы должно идти в недавних версиях JSF. Ты можешь renderizar столько элементов желай только отделяя их из-за места.

4
ответ дан 24.11.2019, 14:12
  • 1
    explicaci и # 243; n она хорошая, понимая, что OP работает с JPA. –   08.06.2016, 20:20
  • 2
    Вот то, что asum и # 237; видя, что OP использует Java США xD –  gugadev 08.06.2016, 21:00

Если ты используешь command button, ты можешь распределять ему свойство update в кнопку для того, чтобы он освежил таблицу данных.

Пример.

<p:commandButton actionListener="#{controlador.accion()}" 
                                                     update=":dataTableId"
                                                     icon="ui-icon-arrowrefresh-1-s"
                                                     title="Cargar Datos">
                                        <f:param name="parametro1" value="valor1"/>
                                        <f:param name="parametro2" value="valor2"/> 
</p:commandButton>
2
ответ дан 24.11.2019, 14:12

Я, что я делаю в этих случаях, дело в том, что, когда я делаю изменение информации, я вновь загружаю список, и в вытекающий список я это освежаю с методом, который я добавил в файле AbstractFacade (я работаю с NetBeans, и этот это создает автоматически, когда присоединяются bean сеанса для организаций), код метода - следующий:

/**
 * Actualiza el listado cuando se ha hecho un cambio y no se refleja 
 * @param entityCollection
 * @return 
 */
public List<T> refreshCollection(List<T> entityCollection) {
    List<T> result = new ArrayList<>();
    if (entityCollection != null && !entityCollection.isEmpty()) {
        getEntityManager().getEntityManagerFactory().getCache().evict(entityCollection.get(0).getClass());
        T mergedEntity;
        for (T entity : entityCollection) {
            mergedEntity = getEntityManager().merge(entity);
            getEntityManager().refresh(mergedEntity);
            result.add(mergedEntity);
        }
    }
    return result;
}

Тогда потом, что загрузил список, назвало этот метод:

public List<Entidad> cargarDatos() {
    Query q = em.createQuery("SELECT E FROM Entidad E");
    return refreshCollection(q.getResultList());
}

Не нужно забывать сделать update datatable для того, чтобы отразились изменения, после обновив список раньше. В общем, таким образом, я решаю эту проблему.

Привет.

1
ответ дан 24.11.2019, 14:12

Так как она soluciГіn, который я нашел... не, из-за которого, он состоял в том, чтобы менять поле пластины на базу данных (В моем случае AI) для того, чтобы он освежал данные в xhtml даже не, из-за которого, я продолжаю искать одну soluciГіn более практическая и работоспособная.

0
ответ дан 24.11.2019, 14:12