我正在尝试将实体(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.ALL
和orphanRemoval = true
。
注意:当将实体从第一组移动到第二组但不是相反时,它可以工作。
答案 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,则通常不会出现问题:
POST
以执行更改;