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();