小编典典

在PostgreSQL中更新数据后不要更改jsp上的数据

jsp

我有从db和servlet获取数据的类,用于将该数据发送到jsp。如果我在表中插入或删除行(使用pgAdmin),将更新jsp上的数据(使用新数据),但是如果我更新表中的现有日期,则不会在jsp上更新(仅在重新启动glassfish之后)。用于ORM的类:

package db_classes;
@Entity
public class heading {
private Integer id;
private String name;
private Long themeCount;
private Collection<topic> topicsById;

@Id
@Column(name = "id")
public Integer getId() {
    return id;
}

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

@Basic
@Column(name = "name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Basic
@Column(name = "theme_count")
public Long getThemeCount() {
    return themeCount;
}

public void setThemeCount(Long themeCount) {
    this.themeCount = themeCount;
}

@OneToMany(mappedBy = "headingByIdHeading")
public Collection<topic> getTopicsById() {
    return topicsById;
}

public void setTopicsById(Collection<topic> topicsById) {
    this.topicsById = topicsById;
}
}

Servlet:

    package controllers;

/**
 * Created by Otani on 25.02.2015.
 */
@WebServlet(name = "Heading_parser")
@Stateful
public class Heading_parser extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Heading_processes heading_processes = new Heading_processes();
        getServletContext().setAttribute("headings",heading_processes.getAllHeading());
   request.getRequestDispatcher("/WEB-INF/views/index.jsp").forward(request, response);
    }

    @Override
    public void init() throws ServletException {

    }
    }

用于获取数据的Heading_processes方法:

public List<heading> getAllHeading() {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();
        try {
            Query query = entityManager.createQuery("SELECT h FROM heading h");
            entityManager.getTransaction().commit();
            return query.getResultList();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        } finally {
            entityManager.close();
        }
        return null;
    }

和index.jsp的片段:

<table class="table-border">
    <tbody>

    <c:forEach var = "heading" items = "${headings}">
        <tr>
            <td class="msg-img"><img src="image/message.png" width="32" height="32" alt="theme"></td>
            <td><a href="showtopic.jsp?topic?id=${heading.id}" title=${heading.name}>${heading.name}</a></td>
            <td class="count">${heading.themeCount} Тем <br> Сообщений:</td>
        </tr>
    </c:forEach>

    </tbody>
</table>

UPD:添加pesistance.xml:

 <persistence-unit name="forum">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>db_classes.heading</class>
        <class>db_classes.message</class>
        <class>db_classes.topic</class>
        <class>db_classes.uncensoredWords</class>
        <class>db_classes.users</class>
        <properties>
            <property name="eclipselink.jdbc.url" value="jdbc:postgresql://localhost:5432/forum"/>
            <property name="eclipselink.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="eclipselink.jdbc.user" value="****"/>
            <property name="eclipselink.jdbc.password" value="*****"/>
        </properties>
    </persistence-unit>
</persistence>

阅读 294

收藏
2020-06-10

共1个答案

小编典典

这很可能是缓存问题。

请参阅以下文档:

https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

缺省情况下,EclipseLink使用共享对象缓存,该缓存缓存持久性单元读取和持久保存的所有对象的子集。EclipseLink共享缓存与本地EntityManager缓存不同。
共享缓存在持久性单元(EntityManagerFactory或服务器)的持续时间内存在,并且由所有EntityManager和持久性单元的用户共享
。本地EntityManager缓存不共享,仅在EntityManager或事务期间存在。

共享缓存的好处在于,一旦读取了对象,如果使用查找操作再次读取了该对象,则无需访问数据库。同样,如果通过任何查询读取该对象,则无需重建该对象,也无需重新获取其关系。

共享缓存的局限性在于,如果通过JDBC或其他应用程序或服务器直接更改数据库,则共享缓存中的对象将失效。

您可以通过在JPA配置中添加以下内容并查看问题是否消失来快速验证这一点:

<property name="eclipselink.cache.shared.default" value="false"/>

是否要永久禁用缓存取决于您的用例,即其他应用程序将在现实世界中更新这些实体。

2020-06-10