跨bean的对象引用

时间:2011-12-05 14:31:54

标签: java object ejb pass-by-reference

今天我遇到了一种情况,就在这里。

我有一个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

2 个答案:

答案 0 :(得分:0)

这不是答案: 由于这个问题很难理解,我试图对其进行改写,无法理解这个问题。

我有一个对象说User要保存在数据库中,在我的SampleBean.add方法中,我通过获取某个序列的下一个val userSequence来获取id。

将相同的值(从userSequence获取的值设置为User对象的id。

现在,在持久化对象时,我没有得到我已在SampleBean.add方法中设置的id值。

对于持久性我正在使用PreparedStatement。你能帮我理解为什么会这样吗?

这部分是答案

您正在进行RemoteLookup,并且在Java Remote对象中不会发送给定的副本而是将其序列化并发送它,如果您想要在删除服务中查看对象所做的更改,那么您将不得不将对象发回

所以代码需要更改:

  1. 更改您的insertLogRow方法并让它返回持久存在的对象:

      public LogRow insertLogRow(LogRow logRow) {
         //Do all database operation
         return logRow;
      }
    
  2. 现在更改来电者代码:

     logRow = RemoteLookup.getSampleBean().insertLogRow(logRow);
     log.println("log id " + logRow.logId());
    
  3. 重建,部署和运行。

    现在你应该看到你在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代理,可以自行更新数据库吗?