我有一个实体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

怎么了?

最佳答案

此更新并非毫无意义:您将taskquest的列表中删除,因此休眠状态将删除taskquest之间的连接。

更新:
我只是注意到您在同一字段上有@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/

10-10 14:10