请教一个诡异的ejb3问题

11-04-28 codershall
请教一个ejb3的问题:

我的程序环境是weblogic、ejb3、openjpa
现在遇到一个诡异的问题:
我定义了一个实体A
class A {
Long id;
String name;

@Transient
Map map;
}

当我用entityManager的接口根据id取出一个实体A的数据
A a = entityManager.find(A.class, 1);
然后我往A的map属性put一些值:
a.map.put("name", "test");

当我把实体a返回给web客户端(通过远程接口)时,
web得到的实体a只有id和name之类属性有值,而map没有值。

我开始以为是@Transient注解的原因,但是当我在A的构造函数里,new一个map,然后put数据进去,然后返回给web客户端,web拿到的实体a的map却是有值的。

class A {
Long id;
String name;

@Transient
Map map;

A(){
map = new HashMap();
map.put("name", "test");
}
}

这样put,web客户端拿到的实体的map属性有数据。

请问各位大侠,这是什么原因啊?
是不是我某些地方用错了?

banq
2011-04-29 16:29
远程需要序列化,所以用Transient的字段就不会传送。

至于你的构造函数中赋值,大概这个对象可能被克隆或创建过一次。

codershall
2011-05-01 18:28
这个只是Transicent注解,不是transient修饰符,所以是可以远程传送的。
调试发现这些类似乎都是被openjpa增强过的类,类名统一都在原类名之前还有openjpa的前缀:org.xxx.openjpa.xxx.原始类名

现在我要在返回web客户端之前手动clone一下整个对象,才能正常传送到web客户端,很诡异,不知道是啥原因……

猜你喜欢