Java 从映射中删除实体将尝试使引用为空

Java 从映射中删除实体将尝试使引用为空,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个实体Quest,其中包含许多Tasks: @Entity public class Quest { @OneToMany(orphanRemoval=true,cascade=CascadeType.ALL) @JoinColumn(name="quest_id") @MapKey(name="taskName") private Map<String, Task> tasks = Maps.createHash(); @Eleme

我有一个实体
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;
Hibernate尝试执行无意义的查询,但失败:

update Task set quest_id=null where quest_id='77149'
这似乎打破了任务与其所有任务之间的联系(
其中quest_id=…
),在我看来,当任务本身被移除时,这似乎是应该做的事情。在任何情况下,它都不应该为任何内容设置空值,它应该完全删除
任务


怎么了?

更新并非无稽之谈:您从
quest
的列表中删除了
任务
,因此hibernate会删除
任务
任务
之间的连接

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

@OneToMany(mappedBy=“quest”,orphanRemoving=true,cascade=CascadeType.ALL)
@映射键(name=“taskName”)
私有映射任务=Maps.createHash();

我在您的应用程序中没有看到ActiveTaskmappings@Bozho这就是这个类真正的名称,但我从示例中删除了所有“活动”以使其更清晰。忘记执行查询。您已在“任务id”列中将任务映射到任务两次。一方面(例如任务)建立mappedBy关系。事实上,这根本不应该起作用。@PeterGwiazda是的,我在寻找
mappedBy
提供的功能,并认为我在
@JoinColumn
中找到了它,但那不是真的。在更改为
mappedBy
后,它能起作用吗?实际上它删除了该任务与其所有任务之间的连接(
WHERE quest_id=…
),在我看来,当任务本身被删除时(它不是)。而且,如果是这种情况,它不应该为空,它应该只删除那些记录。你对更新的操作是正确的。请检查更新的答案!
update Task set quest_id=null where quest_id='77149'
@OneToMany(mappedBy="quest", orphanRemoval=true,cascade=CascadeType.ALL)
@MapKey(name="taskName")
private Map<String, Task> tasks = Maps.createHash();