Java 跨bean的对象引用
今天我遇到了一种情况,就是这样 我有一个db对象要保存。我使用Java 跨bean的对象引用,java,object,ejb,pass-by-reference,Java,Object,Ejb,Pass By Reference,今天我遇到了一种情况,就是这样 我有一个db对象要保存。我使用SampleBean.add方法。在该方法中,我从序列中获取主键,将其设置为db对象的id属性并将其持久化到db(使用PreparedStatement)。但是我无法从调用该bean方法的方法中获取db对象的id属性(它是0,尽管它是在persisteng方法中设置的) 请向我澄清这一点 数据库对象 public class LogRow implements Serializable { public long cardL
SampleBean.add方法。在该方法中,我从序列中获取主键,将其设置为db对象的id属性并将其持久化到db(使用PreparedStatement
)。但是我无法从调用该bean方法的方法中获取db对象的id属性(它是0,尽管它是在persisteng方法中设置的)
请向我澄清这一点
数据库对象
public class LogRow implements Serializable {
public long cardLogId;
public String data;
}
持久化方法
public void insertLogRow(LogRow logRow) {
Connection con = null;
PreparedStatement ps = null;
try {
String insertSql = LogRow.INSERT_LOG;
con = global.getConnection();
if (logger.isEnabled(IMessage.DEBUG1)) {
logger.println(IMessage.DEBUG1, CLASS_NAME + "insertLogRow():: insertSql " + insertSql);
}
ps = con.prepareStatement(insertSql);
logRow.setLogId(seq.getNextVal());
ps.executeUpdate();
} catch (SQLException sqe) {
logger.println("insertLogRow():: SQLException occurred");
throw new ProcessingErrorException(sqe.getMessage());
}
}
我可以在persist方法中看到持久化的id值
调用方法
RemoteLookup.getSampleBean().insertLogRow(logRow);
log.println("log id " + logRow.logId());
此调用方法打印0
这不是答案:
因为这个问题很难理解,我试着重新措辞,不理解就不能编辑这个问题
我有一个对象sayUser
要保存在数据库中,在我的SampleBean中。add
方法我通过获取某个序列的下一个值sayuserSequence
来获取id
将相同的值(从userSequence
获取)设置为用户对象的id
现在,在持久化对象的同时,我没有得到id的值,我已经在SampleBean.add
method中设置了id
对于持久性,我使用的是PreparedStatement
。您能帮助我理解为什么会发生这种情况吗
这部分是答案
您正在执行RemoteLookup,在Java中,远程对象不会发送给给定的副本,而是将其序列化并发送,如果您希望在remove service中看到对对象所做的更改,则必须将对象发送回
因此,需要对代码进行更改:
更改insertLogRow
方法,使其返回已持久化的对象,如:
public LogRow insertLogRow(LogRow logRow) {
//Do all database operation
return logRow;
}
现在更改调用方代码:
logRow = RemoteLookup.getSampleBean().insertLogRow(logRow);
log.println("log id " + logRow.logId());
重建、部署和运行
现在,您应该看到在insertLogRow方法内的对象上设置的id。在构建准备好的语句后,我发现您缺少了一个setLong(1,logRow.getCardLogId())
调用。我假设该语句类似于:
INSERT into LogRow (cardLogId, data) VALUES (?, ?)
然后需要设置?
参数的值:
ps.setLong(1, logRow.getCardLogId());
ps.setString(2, logRow.getData());
但是,可能对象是某种神奇的EJB代理,它会自动更新数据库?你能展示一些代码吗?我不能很好地解析关于“新创建的主键”的句子。你能编辑你的问题并充实一下吗?@Gray我已经更新了,你能现在检查一下吗?@Vanathi,请给我们看一些我仍然不懂的代码。你是说你无法从序列中获取值?还是你试图插入一个由数据库生成的id的对象,而你无法从JDB中获取生成的idC?你能给我一些代码吗?@Vanathi,请看我的答案,并澄清这是否是你的问题。谢谢你的帮助,但我能在add方法中看到id值。我不能在调用方法中看到相同的值,而调用方法是在persisteng方法中设置的。是的,我这样做了。但我想知道背后的原因。非常感谢。@Vanathi很高兴为您提供帮助:),您可能需要阅读以下内容: