我在两个不同的Glassfish域之间进行通信的两个JEE应用程序之间存在持久性问题。
em.persist(entity2)
em.persist(entity1)
不知何故,它应该与我们使用`XADataSource`的事务相同 因此,如果由于任何原因发生运行时异常,则不应该保留实体。
第一次调用 Application1-ejb 的方法时,它可以工作:
可以在日志中看到请求,我可以在 Database1 和 Database2 中看到新实体。
下次调用 Application1-ejb 的方法时,它将不起作用:
em.persist(entity2)
,它也不会将实体持久化数据库 Database2 请求可以在 Application1 的日志中看到,但 Application2 的日志中看不到任何请求。
可以在 Database1 中看到新实体 但是 Database2 中没有新的实体 在浏览器中,看起来服务器没有给客户端任何响应。
如果我使用Hibernate而不是EclipseLink,它将按预期工作。但是迁移到Hibernate并不是我们现在可以承受的,因为我们必须迁移大型JEE应用程序。
如果我强制 Application2-ejb 在em.persist(entity2)
之后刷新,它将每次都有效,并且浏览器总是从服务器接收响应。
但是如果我刷新,则意味着如果在某一点发生异常,则实体将持久存储在 Database2 中(因为刷新),并且中不会保留任何实体Database1 (因为例外),这也不是我们想要的。
应用1 / SessionBean.java
package application1.sessionbeans;
import application1.entities.Entity1;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import application2.sessionbeans.remote.SessionBeanRemote;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class SessionBean implements SessionBeanLocal {
@EJB(name = "SessionBeanRemote-ejbref")
private SessionBeanRemote sessionBeanRemote;
@PersistenceContext
private EntityManager em;
@Override
public void test() {
System.out.println("SessionBean Application1");
em.persist(new Entity1());
sessionBeanRemote.test();
}
}
应用1 /与GlassFish ejb-jar.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>SessionBean</ejb-name>
<jndi-name>java:global/EnterpriseApplication1/EnterpriseApplication1-ejb/SessionBean</jndi-name>
<ejb-ref>
<ejb-ref-name>SessionBeanRemote-ejbref</ejb-ref-name>
<jndi-name>corbaname:iiop:localhost:4537#java:global/EnterpriseApplication2/EnterpriseApplication2-ejb/SessionBean</jndi-name>
</ejb-ref>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
应用1 / persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="EnterpriseApplication1-ejbPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>aEnercomDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
</persistence-unit>
</persistence>
应用2 / SessionBean.java
package application2.sessionbeans;
import application2.entities.Entity2;
import application2.sessionbeans.remote.SessionBeanRemote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class SessionBean implements SessionBeanRemote {
@PersistenceContext
private EntityManager em;
@Override
public void test() {
System.out.println("sessionBean Application2");
em.persist(new Entity2());
}
}
应用2 / persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="EnterpriseApplication2-ejbPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>AEnercomCollectData-DS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
</persistence-unit>
</persistence>
Application2Remote / SessionBeanRemote.java
package application2.sessionbeans.remote;
import javax.ejb.Remote;
@Remote
public interface SessionBeanRemote {
public void test();
}
我试图让这个例子尽可能简单。
这里是否有人能够在不同的Glassfish域之间保持实体没有任何问题?
我是否在persistence.xml中缺少一个可以使其正常工作的属性?