我正在尝试使用 JPA 开发一个简单的基于 JSP 的 Web 应用程序,并且想知道开发一个应用程序的正确用法。
在我的示例应用程序中,我有两个 JSP 页面和一个简单的 Java 类来执行数据库操作。这两个 JSP 文件都使用该 Java 类来执行 DB 操作。
我用 @Stateless
注释了此类,并注入(inject)了一个实体管理器,如下所示:
@PersistenceContext(unitName = "myjpa")
EntityManager em;
在我的 persistence.xml
中,我设置了以下属性:
<property
name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"
/>
我使用 JNDI 在 JSP 中调用该类(因为该类被注释为无状态 session bean),如下所示:
InitialContext ic = new InitialContext();
Sample sample = (Sample) ic.lookup("java:app/" + application.getContextPath() + "/Sample");
我面临以下情况:
当我尝试使用事务
em.getTransaction().begin()/commit()
进行插入和更新时,它说不能在 JTA 情况下使用事务。因此,在 Java 类的构造函数代码中,我使用以下代码:
Properties properties = new Properties();
properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
emf = Persistence.createEntityManagerFactory("myjpa",properties);
em = emf.createEntityManager();
我尝试使用像 em.getTransaction().begin()/commit()
这样的事务。
但在这种情况下,经过 2-3 次数据库更新和加载操作后,页面会变得非常慢。虽然我没有得到任何异常(exception)。总的来说,我的表中的记录少于 25 条。
对我来说,它似乎正在内部等待某些操作完成。
同时,我也觉得我使用 JPA 的方式是错误的,因此征求有关使用 JSP 和 JPA 制作简单 Web 应用程序的正确方法的建议。
虽然我仍在探索 Java EE,如果您对此类案例有任何具体引用,我也愿意阅读和查看它们。
最佳答案
您应该始终努力使用 JTA 事务,这意味着容器将处理事务划分。在您的情况下,如果您想自己处理事务,则需要将其定义为 bean 管理事务。因此,在您的 EJB 类中,在 @Stateless 注解之后,您应该定义以下注解;
@TransactionManagement(TransactionManagementType.BEAN)
通常的最佳实践是让容器处理事务,除非有某些明确的原因需要您使用 Bean 管理的事务。
关于java - jsp应用中JPA的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034710/