Hibernate EJB3 RMI客户端

Hibernate EJB3 RMI客户端,hibernate,jpa,jboss,jakarta-ee,ejb-3.0,Hibernate,Jpa,Jboss,Jakarta Ee,Ejb 3.0,我目前正在使用一个自编的RMI服务器(10年前)处理一个胖客户机应用程序。服务器将EJB1.1/2.0 bean发送给对这些远程对象具有完全访问权限的客户端。提交事务后,服务器将持久化所有脏bean 计划是用JBoss5和EJB3替换服务器,而不(大规模)更改客户端应用程序(大约10000个类文件)。 典型的客户剪报是 UserTransaction tx = ClientCtxManager.getUserTransaction(); tx.begin(); DummyClassHome du

我目前正在使用一个自编的RMI服务器(10年前)处理一个胖客户机应用程序。服务器将EJB1.1/2.0 bean发送给对这些远程对象具有完全访问权限的客户端。提交事务后,服务器将持久化所有脏bean

计划是用JBoss5和EJB3替换服务器,而不(大规模)更改客户端应用程序(大约10000个类文件)。 典型的客户剪报是

UserTransaction tx = ClientCtxManager.getUserTransaction();
tx.begin();
DummyClassHome dummyHome = (DummyClassHome)lookup(DummyClassHome.class.getName());
DummyClass dummy = dummyHome.findByPrimaryKey(1234);
dummy.setValue("Hello World");
tx.commmit();
->虚拟持久化在服务器上

在JBoss上,我使用无状态会话bean来执行findByPrimaryKey。在这个查找器中,我查找一个有状态会话bean的RemoteInterface,我想用它将实体传送到客户端。由于序列化/反序列化,实体会断开与会话的连接,这对于提交更改至关重要

// DummyHome implementation
public MyClass findByPrimaryKey(BigDecimal pk)
{
Session s = HibernateUtil.getSessionFactory().getCurrentSession();
MyClassEntity temp = (MyClassEntity)s.get(MyClassEntity.class, (BigDecimal)pk);
// session.contains(temp) delivers true  
MyClassRemote remote = (MyClassRemote)InitialContextFactory.getInitialContext().lookup("DemoEAR/MyClassBean/remote");
remote.setENTITY(temp); // set the member variable of the stateful session bean
//session.contains(remote.getENTITY()) delivers false
return remote;
}

如有任何建议,将不胜感激

您的主要问题是客户端和服务器之间的系统边界

如果客户机和服务器是本地的(例如,带有EJB3后端的web UI),您可以用自己的方法轻松地更改代码

但在您的情况下,客户机和服务器是远程的,当从服务器返回EJB3实体时,它确实会分离,而在EJB2中实体Bean是远程对象的情况并非如此

在客户端启动的分布式事务使用EJB3,但我建议不要这样做。不过,我明白这可能太难改变了

处理分离实体的可能方法:

  • 在SFSB中使用扩展持久性上下文,这样实体将保持连接在客户端。我还没有看到任何应用程序真正使用它,但这可能是值得探索的
  • 修改EJB3实体并合并服务器端的更改后,将其发送回
  • 看一看。从未使用过它,但它解决了一些与系统和事务边界相关的问题

  • 希望你能找到适合你的模式。

    谢谢你的回答,它为我指明了正确的方向。我现在正在使用扩展持久性上下文,同时将EntityManager注入我的SFSB(@PersistenceUnit(unitName=“xyz”,type=PersistenceContextName.extended)