Java 为什么JSF输出没有更新以反映数据库中的更改?

Java 为什么JSF输出没有更新以反映数据库中的更改?,java,jsf,Java,Jsf,我使用JSF作为我的前端技术。我有一个在桌子上显示的位置列表。我有一个DeleteCommandButton,它通过调用托管bean中的deleteLocation方法成功地从数据库中删除所选条目,然后刷新JSF页面。虽然数据库更新正确,但JSF页面不会显示更新的结果。我不确定问题出在哪里,因为表是从数据库条目生成的,并且数据库已成功更改。这是我的密码。谢谢你的帮助和建议 <tr> <td><div class="white"><H2&g

我使用JSF作为我的前端技术。我有一个在桌子上显示的位置列表。我有一个DeleteCommandButton,它通过调用托管bean中的deleteLocation方法成功地从数据库中删除所选条目,然后刷新JSF页面。虽然数据库更新正确,但JSF页面不会显示更新的结果。我不确定问题出在哪里,因为表是从数据库条目生成的,并且数据库已成功更改。这是我的密码。谢谢你的帮助和建议

<tr>
        <td><div class="white"><H2>Work Locations</H2></div>
            <div class="tables"><h:dataTable value="#{locationsBean.locationsList}" var="l" border="1">

                <div class="td"><h:column>
                <div class="th"><f:facet name="header">
                <div class="generaltext3">County</div>
                </f:facet></div>
                <div class="generaltext2">#{l.countyName}</div>
                </h:column></div>
                <div class="td"><h:column>
                <div class="th"><f:facet name="header">
                <div class="generaltext3">Action</div>
                </f:facet></div>
                <div class="centrebutton"><h:commandButton id="delete" class="myButton2" value="delete" action="#{locationsBean.deleteLocation(l.location_id)}">
                </h:commandButton></div>
              </h:column></div>
            </h:dataTable></div>

            </td>
        </tr>
下面是Java代码

public List<Locations> getLocationsList() {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();   
    List<Locations> locationsList = new ArrayList<Locations>();

    em.getTransaction().begin();

        String sessionEmail=Util.getEmail();
        Query myQuery = em.createQuery("SELECT u FROM BusinessAccount u WHERE u.email=:email");
        myQuery.setParameter("email", sessionEmail);

        List<BusinessAccount> userList=myQuery.getResultList();
        BusinessAccount account =userList.get(0);

        locationsList=account.getLocations();
        em.getTransaction().commit();
        em.close();

        return locationsList;

    }

public String deleteLocation(int id) {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();   

        em.getTransaction().begin();
        Query myQuery = em.createQuery("SELECT l FROM Locations l WHERE l.location_id=:locationId");
        myQuery.setParameter("locationId", id);
        List<Locations> currentLocation=myQuery.getResultList();
        String countyName=currentLocation.get(0).getCountyName();
        em.remove(currentLocation.get(0));
        em.getTransaction().commit();
        em.close();

        this.getLocationsList();

        return "delete";
    } 
在deleteLocation方法中,调用getLocationList,它创建一个新列表并返回它。因此,通过调用this.getLocationList,它完全不起任何作用。这就像说一声新的问候;所有这些都是自己的,而不是分配给任何东西

您应该做的是在deleteLocation方法中将列表bean字段分配给getLocationList。差不多

em.getTransaction().commit();
em.close();
//this.getLocaitonList();
locationList = getLicationList();
return "delete";
旁注

你应该考虑使用三层设计

Web层JSF托管Bean 业务层EJB 持久层JPA
您发布的HTML不是有效的XHTML。Second没有结束对应项。该div在标记之后结束。我的代码解决了在db被更改后更新jsf页面的问题,因此不确定您所说的不是xhtml是什么意思。谢谢你的帮助。我肯定会按照你说的做三层设计。你给出的解决方案没有解决我的问题,但谢谢你的尝试。最后你终于明白了。将在回答中显示它。
    public List<Locations> getLocationsList() {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();   
    em.getTransaction().begin();

        String sessionEmail=Util.getEmail();
        Query myQuery = em.createQuery("SELECT u FROM BusinessAccount u WHERE u.email=:email");
        myQuery.setParameter("email", sessionEmail);

        List<BusinessAccount> userList=myQuery.getResultList();         
        BusinessAccount account =userList.get(0);

        //This line refreshes the account object with the new values from the database and solves the problem that I was having
        em.refresh(account);

        locationsList=account.getLocations();
        em.getTransaction().commit();
        em.close();

        return locationsList;

    }