我正在尝试使用JPA开发一个基于JSP的简单Web应用程序,并且想知道开发它的正确用法。
在我的示例应用程序中,我有两个JSP页面和一个简单的Java类来执行数据库操作。两个JSP文件都使用此Java类来执行数据库操作。
我用@Stateless
注释了这个类,并注入了一个实体管理器,如下所示:
@PersistenceContext(unitName = "myjpa")
EntityManager em;
在我的persistence.xml
我设置了以下属性:
<property
name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"
/>
我正在使用JNDI在JSP中调用该类(因为该类是为无状态会话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次数据库更新和加载操作后页面变得非常慢。虽然我没有得到任何例外。总的来说,我的表中记录的记录不到25条。
对我来说,似乎它在内部等待某些操作完成。
与此同时,我也觉得我使用JPA的方式是错误的,因此请求使用JSP和JPA进行简单的Web应用程序的正确方法的建议。
虽然我还在探索Java EE,但如果您对此类案例有任何具体的参考,我也会阅读并查看它们。
答案 0 :(得分:1)
您应该始终努力使用JTA事务,这意味着容器将处理事务划分。在您的情况下,如果您想要自己处理事务,则需要将其定义为bean管理事务。因此,在您的EJB类中,在@Stateless annoattions之后,您应该定义以下注释;
@TransactionManagement(TransactionManagementType.BEAN)
通常的最佳做法是让容器处理事务,除非您有明确的理由使用Bean管理的事务。
答案 1 :(得分:1)
与此同时,我也觉得我使用JPA的方式是错误的
您的使用确实看似错误。如果您正在使用(无状态)会话bean,则不必使用em.getTransaction().begin()/commit()
,您绝对不必使用Persistence.createEntityManagerFactory
等代码。
您也不必设置属性org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform
。
会话bean为您自动管理事务,并且在Java EE AS(例如JBoss AS)中,您不必配置任何事务管理器或类似事物。
一个例子:
@Stateless
public class UserDAO {
@PersistenceContext
private EntityManager entityManager;
public void add(User user) {
entityManager.persist(user);
}
}
对于persistence.xml
文件,以下内容应足以开始:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="somePU">
<jta-data-source>java:app/someDS</jta-data-source>
</persistence-unit>
</persistence>
更多例子: