我有从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>
这很可能是缓存问题。
请参阅以下文档:
https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching
缺省情况下,EclipseLink使用共享对象缓存,该缓存缓存持久性单元读取和持久保存的所有对象的子集。EclipseLink共享缓存与本地EntityManager缓存不同。 共享缓存在持久性单元(EntityManagerFactory或服务器)的持续时间内存在,并且由所有EntityManager和持久性单元的用户共享 。本地EntityManager缓存不共享,仅在EntityManager或事务期间存在。 共享缓存的好处在于,一旦读取了对象,如果使用查找操作再次读取了该对象,则无需访问数据库。同样,如果通过任何查询读取该对象,则无需重建该对象,也无需重新获取其关系。 共享缓存的局限性在于,如果通过JDBC或其他应用程序或服务器直接更改数据库,则共享缓存中的对象将失效。
缺省情况下,EclipseLink使用共享对象缓存,该缓存缓存持久性单元读取和持久保存的所有对象的子集。EclipseLink共享缓存与本地EntityManager缓存不同。 共享缓存在持久性单元(EntityManagerFactory或服务器)的持续时间内存在,并且由所有EntityManager和持久性单元的用户共享 。本地EntityManager缓存不共享,仅在EntityManager或事务期间存在。
共享缓存的好处在于,一旦读取了对象,如果使用查找操作再次读取了该对象,则无需访问数据库。同样,如果通过任何查询读取该对象,则无需重建该对象,也无需重新获取其关系。
共享缓存的局限性在于,如果通过JDBC或其他应用程序或服务器直接更改数据库,则共享缓存中的对象将失效。
您可以通过在JPA配置中添加以下内容并查看问题是否消失来快速验证这一点:
<property name="eclipselink.cache.shared.default" value="false"/>
是否要永久禁用缓存取决于您的用例,即其他应用程序将在现实世界中更新这些实体。