我有一个远程ejb,它接受一个对象。它使用setter方法修改该对象中的数据。在客户端中,我使用getter方法打印了值,并观察到值已更改。
但文档Sum results of a few queries and then find top 5 in SQL表示参数是隔离的。有人可以解释一下吗?
@Remote
public class RemoteServiceBean {
public Student parameterIsolationTest(final Student student) {
student.setName("modified");
return student;
}
}
public class MyClient {
public static void main(String arg...) {
....
Student student = new Student();
student.setName("Krishna");
remoteService.parameterIsolationTest(student);
System.out.println(student.getName()); // prints modified
}
}
答案 0 :(得分:1)
服务器端的bean使用服务器JVM中存在的Java对象进行操作。客户端具有不同的JVM,因此具有不同的对象集。当您进行远程EJB调用时,需要以某种方式将这些对象“转移”到客户端并返回。问题是这种“转移”只发生在EJB调用本身。因此,如果您的客户端在EJB上调用setter,则另一个对象将被发送到服务器,但如果客户端之后修改此对象(不调用EJB bean上的任何内容),则客户端的对象将不会传输到服务器 - 服务器不会知道客户端更改了对象。
如果我理解你的场景,你在EJB上调用一个setter,然后在同一个属性上调用getter。 Setter和getter都是EJB的方法,因此这将包括EJB调用,在这种情况下,您从客户端进行的更改将传播到服务器。
答案 1 :(得分:0)
"远程业务接口的方法的参数和结果按值传递。"来源JSR 318: Enterprise JavaBeans,Version 3.1第45页,3.2.1远程客户端
你的学生'对象不是通过引用传递,而是通过值传递,因为EJB使用@Remote注释。
尝试替换行
remoteService.parameterIsolationTest(student);
与
student = remoteService.parameterIsolationTest(student);