在jsp应用程序中正确使用JPA

时间:2013-04-16 10:28:25

标签: java jsp java-ee jpa

我正在尝试使用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");

我面临以下情况:

  1. 当我尝试使用事务em.getTransaction().begin()/commit()进行插入和更新时,它表示不能将事务与JTA案例一起使用。

  2. 因此,在我的Java类的构造函数代码中,我使用以下代码:

  3. 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,但如果您对此类案例有任何具体的参考,我也会阅读并查看它们。

2 个答案:

答案 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>

更多例子: