今天我遇到了一种情况,就在这里。
我有一个db对象要坚持。我使用SampleBean.add
方法。在该方法中,我从序列中获取主键,将其设置为db对象的id属性并将其持久保存到db(使用PreparedStatement
)。但我无法从调用该bean方法的方法获取db对象的id属性(它来自0,即使它已经在持久化方法中设置)。
请告诉我这个。
数据库对象
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
答案 0 :(得分:0)
这不是答案: 由于这个问题很难理解,我试图对其进行改写,无法理解这个问题。
我有一个对象说User
要保存在数据库中,在我的SampleBean.add
方法中,我通过获取某个序列的下一个val userSequence
来获取id。
将相同的值(从userSequence
获取的值设置为User对象的id。
现在,在持久化对象时,我没有得到我已在SampleBean.add
方法中设置的id值。
对于持久性我正在使用PreparedStatement
。你能帮我理解为什么会这样吗?
这部分是答案
您正在进行RemoteLookup,并且在Java Remote对象中不会发送给定的副本而是将其序列化并发送它,如果您想要在删除服务中查看对象所做的更改,那么您将不得不将对象发回
所以代码需要更改:
更改您的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。
答案 1 :(得分:0)
在您构建预准备语句后,我发现您错过了setLong(1, logRow.getCardLogId())
调用。我认为这句话是这样的:
INSERT into LogRow (cardLogId, data) VALUES (?, ?)
然后你需要设置?
参数的值:
ps.setLong(1, logRow.getCardLogId());
ps.setString(2, logRow.getData());
但也许对象是某种神奇的EJB代理,可以自行更新数据库吗?