Обновление нескольких строк - Hibernate - PullRequest
0 голосов
/ 01 июля 2011

В моей таблице адресов у меня есть поле с именем isPrimary. Для каждого адреса, назначенного пользователю, пользователь может иметь только один адрес в качестве основного.

У меня есть метод ниже, который я пытаюсь исправить. Если новый адрес должен быть создан и для атрибута isPrimary установлено значение true, мне нужно обновить все существующие адреса пользователей и установить для isPrimary значение false.

Когда этот метод вызывается и для существующей записи атрибут имеет значение true. Возвращение, которое я получаю обратно, равно нулю.

Возможно ли это сделать? Я бы использовал триггер, но MySql не поддерживает триггеры, действующие на таблицу, в которую они вставляют / обновляют.

Это мой метод сохранения

@Override 
public UserAddress save(UserAddress obj) throws UserException
{
    if(obj.getIsPrimary())
    {
        List<UserAddress> addressList = template.find("FROM UserAddress WHERE UserID = ?", obj.getUserAccount().getUserId());

        for(Iterator<UserAddress> i = addressList.iterator(); i.hasNext();)
        {
            i.next().setIsPrimary(false);

            template.update(i.next());
        }           
    }

    template.saveOrUpdate(obj);

    return obj;
}

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Пожалуйста, внесите несколько изменений в ваш метод. Вы вызываете i.next() дважды в цикле for. i.next() получить следующий элемент в списке.

@Override 
public UserAddress save(UserAddress obj) throws UserException
{
    if(obj.getIsPrimary())
    {
        List<UserAddress> addressList = template.find("FROM UserAddress WHERE UserID = ?", obj.getUserAccount().getUserId());

        for( UserAddress add : addressList )
        {
            add.setIsPrimary(false);

            template.update(add);
        }           
    }

    template.saveOrUpdate(obj);

    return obj;
}
1 голос
/ 01 июля 2011

Проблема в вашем коде заключается в том, что вы вызываете next () дважды в цикле. Это должно работать:

    for(UserAddress> addr: addressList)
    {
        addr.setIsPrimary(false);

        template.update(addr);
    }           

Лично я бы создал класс User, такой как:

class User {
   private List<UserAddress> addresses = new ArrayList<UserAddress>();
   private UserAddress primaryAddress;
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...