Java 跨bean的对象引用

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

今天我遇到了一种情况,就是这样

我有一个db对象要保存。我使用
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
这不是答案: 因为这个问题很难理解,我试着重新措辞,不理解就不能编辑这个问题

我有一个对象say
User
要保存在数据库中,在我的
SampleBean中。add
方法我通过获取某个序列的下一个值say
userSequence
来获取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很高兴为您提供帮助:),您可能需要阅读以下内容: