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