【问题标题】:JPA, EJB and JTA in a stand alone application独立应用程序中的 JPA、EJB 和 JTA
【发布时间】:2014-02-07 13:42:08
【问题描述】:

我有我的 j2ee 应用程序,并且我设计了一个 EJB 模块,它使用 JPA 在数据库中存储项目。在这个 EJB 包中,我有一个 persistence.xml,它引用了通常由应用服务器提供的 JTA 数据源。

现在我必须构建另一个仅使用我的应用程序的 EJB 模块的应用程序。它是一个独立的应用程序,所以没有 j2ee 服务器。 我该怎么做?我需要一个 EJB 容器和一个 JPA 提供程序,我明白这一点,但我还需要在 ejb jar 中的 persistence.xml 中定义的 jndi 中提供数据源。我还在我的 ejb 包中使用容器管理的事务和依赖注入,我希望一切都像 j2ee 对应物一样工作,而不需要修改 ejb 模块。

【问题讨论】:

    标签: jakarta-ee ejb jndi jta


    【解决方案1】:

    我正在使用来自独立应用程序的 JEE JPA 模块进行测试,但想法是相同的。有一种方法,EntityManagerFactory createEmf(),可以创建EntityManagerFactory,如下所示:

    public static EntityManagerFactory createEmf() {
        try {
            HashMap<String,String> cfg = new HashMap<String,String>();
    
            String connUrl = ...;
            String userName = ...;
            String password = ...;
    
            cfg.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
            cfg.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    
            cfg.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
            cfg.put("hibernate.connection.username", userName);
            cfg.put("hibernate.connection.password", password);
            cfg.put("hibernate.connection.url", connUrl);
            // worked for Hibernate 4.0.1; doesn't work for 4.3:
            //cfg.put("javax.persistence.jtaDataSource", "");
            // works for 4.3:
            cfg.put("javax.persistence.jtaDataSource", null);
            cfg.put("hibernate.hbm2ddl.auto", "create");
            cfg.put("hibernate.show_sql", "true");
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("xxxxxPU",cfg);
            return emf;
        }
        catch(RuntimeException re) {
            throw re;
        }
        catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
    

    核心是Persistence.createEntityManagerFactory(name,properties) 方法。 persistence.xml 中声明的属性 overridecomplement 值。

    在实际实现中,我从proerties 文件中读取连接参数。所以不需要DataSource(如果这是客户端应用程序,希望只有一个连接,所以不需要池)。

    但是,这样,您必须手动管理交易!!!一种解决方法是使用 CDI 或 AOP 拦截器将您的业务方法与事务包装起来。这需要一些努力,但可能会为您节省启动独立 EJB 容器的开销。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2012-09-20
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多