Ссылка на объект через бины - PullRequest
0 голосов
/ 05 декабря 2011

Сегодня я столкнулся с одной ситуацией, вот она.

У меня есть объект БД для сохранения.Я использую SampleBean.add метод.Внутри этого метода я получаю первичный ключ из последовательности, устанавливаю его для свойства id объекта db и сохраняю его в db (используя PreparedStatement).Но я не смог получить свойство id объекта db (оно равно 0, даже если оно установлено в постоянном методе) из метода, которым я вызываю этот метод bean.

Пожалуйста, объясните мне это.

Объект БД

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());
        } 
}

Я вижу постоянное значение идентификатора здесь в постоянном методе.

Вызов метода

RemoteLookup.getSampleBean().insertLogRow(logRow);
log.println("log id " + logRow.logId());

Этот вызывающий метод печатает 0

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Считаю, что вы пропускаете звонок setLong(1, logRow.getCardLogId()) после того, как составите свое подготовленное заявление.Я предполагаю, что это утверждение выглядит примерно так:

INSERT into LogRow (cardLogId, data) VALUES (?, ?)

Тогда вам нужно установить значения для ? аргументов:

ps.setLong(1, logRow.getCardLogId());
ps.setString(2, logRow.getData());

Но, возможно, объект является своего рода волшебным EJBпрокси, который обновляет базу данных сам?

0 голосов
/ 05 декабря 2011

Это не ответ: Поскольку вопрос очень сложен для понимания, я попытался перефразировать его, не могу отредактировать вопрос, не понимая его.

У меня есть объект скажем User для сохранения в базе данных. В моем методе SampleBean.add я извлекаю идентификатор, получая следующее значение некоторой последовательности, скажем userSequence.

То же значение (извлечено из userSequence установлено как идентификатор объекта пользователя.

Теперь, сохраняя объект, я не получаю значение id, которое я уже установил в методе SampleBean.add.

Для настойчивости я использую 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());
    

Перестройка, развертывание и запуск.

Теперь вы должны увидеть свой идентификатор, который был установлен для объекта внутри метода insertLogRow.

...