我目前正在使用自编写的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;
}
任何建议都将不胜感激!
答案 0 :(得分:0)
您的主要问题是客户端和服务器之间的系统边界。
如果客户端和服务器是本地的(例如带有EJB3后端的Web UI),您可以轻松地使用您的方法更改代码。
但是在你的情况下,客户端和服务器是远程的,EJB3实体在从服务器返回时确实会脱离,而EJB2中Entity Bean是远程对象的情况并非如此。
在客户端使用EJB3启动的分布式事务,但我建议不要使用它。但我知道改变可能太多了。
处理分离实体的可能方法:
希望你会找到一个适合你的模式。