我有一个实体Quest
,其中包含许多Task
:
@Entity
public class Quest {
@OneToMany(orphanRemoval=true,cascade=CascadeType.ALL)
@JoinColumn(name="quest_id")
@MapKey(name="taskName")
private Map<String, Task> tasks = Maps.createHash();
@ElementCollection
@OrderColumn
private Set<String> completedTasks;
@Entity
public class Task implements Serializable {
@ManyToOne(optional=false)
@JoinColumn(name="quest_id")
private Quest quest;
@Column(nullable=false,updatable=false,length=50)
private String taskName;
现在,当我这样做时:
// store the task as completed
quest.getCompletedTasks().add(taskName); // set
// remove the task entity
quest.getTasks().remove(taskName); // map
Hibernate尝试执行无意义的查询,但失败:
update Task set quest_id=null where quest_id='77149'
这似乎打破了任务与其所有任务(
WHERE quest_id = ...
)之间的联系,在我看来,当任务本身被移除(不是)时,这似乎是一件值得做的事情。无论如何,它都不应该为null,而应该完全DELETE
Task
。怎么了?
最佳答案
此更新并非毫无意义:您将task
从quest
的列表中删除,因此休眠状态将删除task
与quest
之间的连接。
更新:
我只是注意到您在同一字段上有@JoinColumn
和@OneToMany
。我认为您应该改为这样做(取决于您使用的休眠版本):
@OneToMany(mappedBy="quest", orphanRemoval=true,cascade=CascadeType.ALL)
@MapKey(name="taskName")
private Map<String, Task> tasks = Maps.createHash();
关于java - 从 map 中删除实体会尝试使引用无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11668528/