Почему я не могу добавить сохранение более 1 объекта в свой LinkedList при использовании JDO? - PullRequest
0 голосов
/ 07 июля 2011

Я использую Google App Engine и JDO.В одном из моих сервлетов я добавляю объекты в связанный список и сохраняю все с помощью диспетчера персистентности.До конца сервлета он показывает, что все работает нормально.он добавляет связанный список хорошо.Но когда я пытаюсь извлечь этот связанный список из хранилища данных, используя страницу jsp, я обнаруживаю, что в этот связанный список добавляется только один объект.Остальные объекты, которые я добавил в связанный список, не сохраняются в хранилище данных.Почему это происходит?
Заранее спасибо.вот код:

 public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {

  resp.setContentType("text/html");

  PersistenceManager pm = PMF.get().getPersistenceManager();
  try
  {
//.... 
    for(int j=0; j<coordinate.length; j++){
        if(j < locations.size()){
                locations.get(j).getCoordinate().setLatitude(coordinate[j].x);
                locations.get(j).getCoordinate().setLongitude(coordinate[j].y);                         
        }else{
                        loc.setLatitude(coordinate[j].x);
                        loc.setLongitude(coordinate[j].y);
                        locat.setCoordinate(loc);
                        locations.add(locat);
        }
                   System.out.println(locations.size());
    }
    }catch(Exception ex){
        System.out.println("Error fetching runs: " + ex);
    }final{
        pm.close();
    }
 }

1 Ответ

3 голосов
/ 07 июля 2011

Ваш код не завершен, поэтому трудно быть уверенным, но я подозреваю, что вы в основном делаете это:

Location locat = new Location();
List<Location> locations = ...;
for (int j = 0; j < coordinate.length; j++) {
    // ...
    locat.setCoordinate(loc);
    locations.add(locat);
}

В Java добавление объекта в список не приводит к копированию объекта в список. В списке просто хранится ссылка на ваш объект. Таким образом, на каждой итерации вы перезаписываете то, что хранили в объекте на предыдущей итерации, и добавляете новую ссылку на тот же объект в списке. В конце список содержит N ссылок на один и тот же объект.

Таким образом, когда хранилище данных сохраняет список в базе данных, оно замечает, что список содержит один и тот же объект, дублированный n раз, и сохраняет объект только один раз.

Таким образом, вы должны создавать новый объект местоположения на каждой итерации:

List<Location> locations = ...;
for (int j = 0; j < coordinate.length; j++) {
    // ...
    Location locat = new Location();
    locat.setCoordinate(loc);
    locations.add(locat);
}
...