SessionBean方法传递的对象类型参数究竟是“值”还是“引用”

07-01-04 handsome
    

最近开始使用J2EE做项目。

平台选用的是JDK 1.5 + GlassFish + JSF

在JSF的ManagedBean中调用了EJB方法,传递参数是对象,但具体执行过程中并非引用传递...

例如有SessionBean如下:

-----------------------------------

@Stateless

public class TestSessionBean implements TestSessionRemote, TestSessionLocal {

@PersistenceContext(unitName="TEST-PU")

private EntityManager em;

public TestSessionBean () {

}

// 这个就是留给ManagedBean调用的方法

public void persist(TestEntityBean testEntityBean) {

// 在这个方法内,按一定规则生成了实体Bean的主键

testEntityBean.setId(123l); // 它是一个Long类型

// 在这个方法内,按一定规则记录了一些其它信息

testEntityBean.setDesc("写下了一些描述信息"); // 它是一个String

// 把这个testEntityBean写入数据库

em.persist(testEntityBean);

}

}

---------------------------

接着便出现了非常郁闷的问题,按理说Java在传递对象时候是“引用”的规则(准确点说其实是传递的地址),传入了一个testEntityBean之后,我在方法内部修改这个对象的值,在方法执行完成后,这些改动同样生效于外部——但事与愿违,我在SessionBean方法中对传入的对象进行任何修改都无法在外部生效,而写入数据库的结果却是函数内部修改过的内容...

莫非是SessionBean方法调用的时候,又是按值来传递对象的么?

    

banq
2007-01-07 11:42

EJB因为是可能跨多个JVM,一般按值传递,当然这个可以设置,如在JBoss 4.0.5中设置deploy下的ear-deployer.xml,如果你确定是一个JVM,可设置CallByValue为false

GlassFish 应该有相关设置。