1

我正在尝试使用 JPA 开发一个简单的基于 JSP 的 Web 应用程序,并且想知道开发应用程序的正确用法。

在我的示例应用程序中,我有两个 JSP 页面和一个简单的 Java 类来执行数据库操作。这两个 JSP 文件都使用这个 Java 类来执行 DB 操作。

我已经用以下方式注释了这个类@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 类的构造函数代码中,我使用以下代码:

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

4

2 回答 2

1

您应该始终努力使用 JTA 事务,这意味着容器将处理事务分界。在您的情况下,如果您想自己处理事务,则需要将其定义为 bean 托管事务。因此,在您的 EJB 类中,在 @Stateless 注释之后,您应该定义以下注释;

@TransactionManagement(TransactionManagementType.BEAN)  

通常的最佳实践是让容器处理事务,除非有明确的理由让您使用 Bean 管理的事务。

于 2013-04-16T10:58:38.583 回答
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>

更多示例:

于 2013-04-16T18:51:28.460 回答