playframework的多对多删除问题

问题描述:

PlayFramework(JPA,Hibernate)。两个实体software < -m:n->tag,software是该关系的所有者。我不使用任何cascading。 我想删除其中包含一些软件的tagplayframework的多对多删除问题

考虑到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)的作品,其中的对象是自动提交(沿变化)时不同交易结束。

+0

事实上,即使使用Tag.em()。persist(),它也需要使用save(),这是否意味着播放以某种方式对EnityManager/Hibernate有影响?即这个em()已经准备/配置为需要明确使用save()吗? – ses 2011-03-23 17:02:23

+0

是的,如果您阅读我在上面发布的链接,则需要明确说出“保存”以存储更改。 – 2011-03-23 17:25:49