我有一个实体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 = ...
),在我看来,这就像任务完成时要做的事情本身被删除(但事实并非如此)。无论如何,它不应该清空任何内容,而应该完全DELETE
Task
。
出了什么问题?
最佳答案
更新并非无意义:您从 quest
列表中删除了 task
,因此 hibernate 删除了 task
与任务
。
更新:
我刚刚注意到您在同一字段上有 @JoinColumn
和 @OneToMany
。我认为你应该这样做(取决于你使用的 hibernate 版本):
@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/