将实体移动到另一个列表

时间:2015-05-03 20:23:39

标签: java jpa

我正在尝试将实体(JPA)从一个列表移动到另一个列表。

问题是实体被删除而不是被移动(在数据库中)。

模型(简化):

@Entity
public class Group {
    @Id
    @GeneratedValue
    @Column(name = "Id")
    private long id;
    @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Item> items;

    public Group() {
        this.items = new ArrayList<>();
    }

    public List<Item> getItems() {
        return items;
    }

    public long getId() {
        return id;
    }
}

@Entity
public class Item {
    @Id
    @GeneratedValue
    @Column(name = "Id")
    private long id;
    private Group group;

    public Item() {
    }

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }

    public long getId() {
        return id;
    }
}

移动操作以这种方式执行:

oldGroup.getItems().remove(item);
item.setGroup(newGroup);
newGroup.getItems().add(item);

调试显示列表已正确更新,但JPA无法检测到该实体是否在其他地方使用,只关注CascadeType.ALLorphanRemoval = true

注意:当将实体从第一组移动到第二组但不是相反时,它可以工作。

2 个答案:

答案 0 :(得分:1)

orphanRemoval = true表示:如果从列表中删除实体,请将其删除。所以这正是你不想发生的事情。

所以只需从注释中删除该属性(或将其设置为false)。

答案 1 :(得分:1)

OneToMany

的定义
/**
 * (Optional) Whether to apply the remove operation to entities that have
 * been removed from the relationship and to cascade the remove operation to
 * those entities.
 * @since Java Persistence 2.0
 */
boolean orphanRemoval() default false;

所以我担心,只要你从关系中移除实体,它就会被删除。

如果您想保留orphanRemoval并避免此问题,您只需在Item方进行更改,而无需更改集合:

item.setGroup(newGroup);

没有getItems().remove / add(item)

如果您确实需要更新集合,则可以在对集合执行更改之前detach oldGroup

请注意,如果您在网络应用程序的上下文中,如果您的网址是REST,则通常不会出现问题:

  1. 客户端发送POST以执行更改;
  2. 服务器执行更改并使用重定向回复;
  3. 客户端遵循重定向,从数据库重新加载实体。