更新多行 - 休眠

时间:2011-07-01 07:19:09

标签: java hibernate

在我的地址表中,我有一个名为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 个答案:

答案 0 :(得分:1)

代码中的问题是你在循环中调用next()两次。这应该有效:

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

        template.update(addr);
    }           

个人而言,我会创建一个User类,例如:

class User {
   private List<UserAddress> addresses = new ArrayList<UserAddress>();
   private UserAddress primaryAddress;
...
}

答案 1 :(得分:1)

请对您的方法进行一些更改。你在for循环中调用i.next()两次。 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;
}