从Map中删除实体会尝试使引用为空

时间:2012-07-26 11:43:23

标签: java hibernate jpa

我有一个实体Quest,其中包含许多Task s:

@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 = ...)之间的联系,这似乎是我在删除任务本身时要做的事情(它不是' T)。在任何情况下,它都不应该为null,它应该DELETE完全Task

有什么问题?

1 个答案:

答案 0 :(得分:2)

更新并非荒谬:您从task的列表中删除quest,因此hibernate会删除taskquest之间的连接。

更新: 我刚刚注意到您在同一个字段中有@JoinColumn@OneToMany。我认为你应该这样做(取决于你使用的hibernate版本):

@OneToMany(mappedBy="quest", orphanRemoval=true,cascade=CascadeType.ALL)
@MapKey(name="taskName")
private Map<String, Task> tasks = Maps.createHash();