谁知道这个错误怎么解决 javax.transaction.xa.XAException: 违反协议

最近我遇到一个问题, 调用实体Bean更新数据库的时候出现违反协议异常.具体配置:
DB: Oracle 8i App: Weblogic 8.1

表结构:
SWDM VARCHAR2(7) not null PK
NSRMC VARCHAR2(100) not null,
KHH VARCHAR2(40),
JYDZ VARCHAR2(100),
FDDBR VARCHAR2(20),
FRDH VARCHAR2(50),
BSR VARCHAR2(10),
BSRDH VARCHAR2(50),
BSRSJ VARCHAR2(50),
EMAIL VARCHAR2(50),
ZZJGDMZH VARCHAR2(50),
DLFS VARCHAR2(1) default '0' not null,
WTDZ VARCHAR2(1) default '0' not null,
DAILI VARCHAR2(1) default '0' not null,
BAOYAN VARCHAR2(1) default '0' not null,
APPLYTIME DATE,
REPLYTIME DATE,
SFPZ VARCHAR2(1),
HFNR VARCHAR2(200)

我创建一个CMP实体BEAN来表示这个表. 使用SESSION BEAN来调用, 其中有一个方法有问题:
public void approve(String swdm, String approved, String hfnr) throws
UpdateException {
String[] msg = null;
ApplicationHome ah = null;
if (swdm == null) {
msg = new String[] {"用户申请", "没有指定税务代码"};
throw new UpdateException(msg);
}
if (approved == null ||
(!(approved.equals(Application.YES) ||
approved.equals(Application.NO)))) {
msg = new String[] {"用户申请", "是否批准必须是字符串0或者1"};
throw new UpdateException(msg);
}

try {
ah = (ApplicationHome) EJBObjectFactory.getEntityBeanHome(
Constant.APPLICATION);

Application a = ah.findByPrimaryKey(swdm);
////////////////////////////////////////////////
// 此处有问题, setSfpz()执行的时候总把数据库的那个字段改成乱码,而且乱码还经常变化, 有时还抛出异常, 我使用客户端测试SessionBean的时候还经常抛出异常,如果把a.setReplyTime()注释掉, 则没有问题.
a.setHfnr(hfnr);
a.setReplytime(new Timestamp(Calendar.getInstance().getTimeInMillis()));
a.setSfpz(approved);
///////////////////////////////////////////////////

} catch (NamingException ex) {
ex.printStackTrace();
msg = new String[] {"用户申请", "查找EJB失败"};
throw new UpdateException(msg);
} catch (FinderException ex) {
ex.printStackTrace();
msg = new String[] {"用户申请", "没有找到这个申请, 税务代码:" + swdm};
throw new UpdateException(msg);
}

}

问题没帮你解决,告诉解决问题的方法:
a.setHfnr(hfnr);
a.setReplytime(new Timestamp(Calendar.getInstance().getTimeInMillis()));

将这两句分开写,特别是time这一段,可以分成5行左右,每行用log输出,输出如果是乱码,那么写入数据库当然是乱码,估计你使用Calendar反复不对,建议你数据表时间字段用String,不要用Date什么。