playframework的多对多删除问题
问题描述:
PlayFramework(JPA,Hibernate)。两个实体software
< -m:n->tag
,software
是该关系的所有者。我不使用任何cascading
。 我想删除其中包含一些软件的tag
。playframework的多对多删除问题
考虑到software
是业主方,我写在我的Tag类:
class Tag {
@Override
public Tag delete() {
for (Software software : this.softwares) {
software.tags.remove(this);
software.save(); // if we delete this, we will have an error - a foreign key constraint fails
}
return super.delete();
}
}
现在工作得很好,我已经添加行software.save()
后。 问题是:为什么我应该这样做?
我有另一个项目 - 没有Play框架 - 它使用JPA-> Hibernate,我不必这样做。那有什么区别?
在this link它们也不使用save()。
答
您链接到的示例中的代码与您的代码不完全相同。
在你链接就挖掉了一些元素,但如果你在评论阅读下面他们说代码:
// then merge() and flush()
将更改保存到数据库中。他们也正在从拥有关系的班级中搬走。
在您的方案中,您正在移除标签,而所有者是关系的另一端。因此,您使用(正确)software.tags.remove来清除关系。
现在,如果不保存,实体管理器尚未确认更改,并且当它试图删除标签时,此实体管理器将检测到M:N活动关系并失败。
的原因是游戏的explicit save,在那里你必须告诉系统更改,以保存,这是从“默认”方式的Hibernate(JPA)的作品,其中的对象是自动提交(沿变化)时不同交易结束。
事实上,即使使用Tag.em()。persist(),它也需要使用save(),这是否意味着播放以某种方式对EnityManager/Hibernate有影响?即这个em()已经准备/配置为需要明确使用save()吗? – ses 2011-03-23 17:02:23
是的,如果您阅读我在上面发布的链接,则需要明确说出“保存”以存储更改。 – 2011-03-23 17:25:49