不同的JPA持久性单元(/ EAR / EJB)在同一个DB上同一个实体:任何人?

时间:2014-09-17 12:57:39

标签: java jpa transactions ejb jpa-2.0

我有一个企业Web应用程序,我们称它为AppOne,包含多个WAR和一个EJB,它使用JPA 2对一组实体执行CRUD操作。

现在我需要构建另一个企业Web应用程序,让它称之为AppTwo,它具有类似的结构(包含n WARS + EJB的EAR),需要共享AppOne的相同实体和数据库。

AppOne和AppTwo都将驻留在同一个应用程序服务器上。

我使用JBoss 7,Hibernate 4作为JPA 2提供程序,我的实体会自动扫描。

我的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="FoobarService"  transaction-type="JTA">
      <jta-data-source>java:jboss/datasources/foobarDS</jta-data-source>      
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
         <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
         <property name="hibernate.show_sql"    value="true" />
         <property name="format_sql"            value="true" />
         <property name="use_sql_comments"      value="true" />      
         <!-- when using type="yes_no" for booleans, the line below allows booleans in HQL expressions: -->
         <property name="hibernate.query.substitutions" value="true 'Y', false 'N'"/>
      </properties>
   </persistence-unit>
</persistence>

我在考虑克隆&#34; (阅读:复制和粘贴)包含实体和相关DAO部分的AppOne的EJB部分到AppTwo的EJB中,但由于我从未用JPA做过这些,我是想知道这是否可行/可行(或者考虑到AppOne已经部署在生产环境中,因此我不能将它的EJB用于共享),特别是如果:

  1. AppOne和AppTwo持久性单元是否可以共存? (I've read of problems但我不确定他们是否与此相关或者他们是否已经同时解决了这些问题。
  2. 如何处理交易?我的意思是,如果来自两个不同EJB的两个不同的PU试图同时更新同一个实体,会发生什么?
  3. 你能想到这种方法的任何问题吗?除了明显的冗余,这将迫使我在未来的实体/数据库修改的情况下更新两次文件。

1 个答案:

答案 0 :(得分:1)

我从未尝试过,但我认为应该没有(大)问题。

  1. 是的,他们可以共存。例如,如果每个部署都使用单独的ClassLoader。
  2. 每个应用程序的事务都不会彼此了解。它将与两个用户在同一个按钮上一个接一个地点击一样。
  3. 我个人认为没有任何问题。如果您的服务器配置奇怪,则必须为每个应用程序配置JBoss to isolate