EJB3 RMI客户端

时间:2010-08-10 14:32:19

标签: hibernate jpa jboss java-ee ejb-3.0

我目前正在使用自编写的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;
}

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

但是在你的情况下,客户端和服务器是远程的,EJB3实体在从服务器返回时确实会脱离,而EJB2中Entity Bean是远程对象的情况并非如此。

在客户端使用EJB3启动的分布式事务,但我建议不要使用它。但我知道改变可能太多了。

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

  1. 对SFSB使用扩展持久化上下文,这样实体仍然连接在客户端。我还没有看到任何使用它的应用程序,但这可能是值得探索的。
  2. 在修改EJB3实体并在服务器端合并更改后发回EJB3实体。
  3. 看看H3T。从未使用它,但它解决了与系统和事务边界相关的一些问题。
  4. 希望你会找到一个适合你的模式。