Java Hibernate自动删除多对多关系
我有一个应该是多对多(双向)的列表 这是过滤器类:Java Hibernate自动删除多对多关系,java,hibernate,postgresql,Java,Hibernate,Postgresql,我有一个应该是多对多(双向)的列表 这是过滤器类: @ManyToMany(targetEntity=Serving.class) @JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={ @JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")}) private List<Serving> servings; pub
@ManyToMany(targetEntity=Serving.class)
@JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={
@JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")})
private List<Serving> servings;
public List<Serving> getServing() { return this.servings; }
public void setServing(List<Serving> servings) { this.servings = servings; }
事实上,我根本不做任何删除,也不要求hibernate删除任何内容。我不明白的事情可能会发生。。。如何防止Hibernate被删除?还是有什么我做得不对?在代码中的某个地方,您必须清除服务的筛选器集合,或者将此集合设置为null。Hibernate使这种更改持久化 还要注意,您的映射是错误的,这就是您看到奇怪行为的原因。与双向manytomy不同,您有两个不相关的单向manytomy,它们都使用相同的联接表。必须选择一条边作为另一条边的反方向。例如,如果希望过滤器端是关联的所有者,则必须使用
mappedBy
属性将服务端标记为反向端:
class Filter {
@ManyToMany
@JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={
@JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")})
private List<Serving> servings;
}
class Serving {
@ManyToMany(mappedBy = "servings")
private List<Filter> filters;
}
类过滤器{
@许多
@JoinTable(name=“BRIDGE\u SERV\u FILTER”,JointColumns={
@JoinColumn(name=“filter\u id”)},inverseJoinColumns={@JoinColumn(name=“service\u id”)})
私人列表服务;
}
班级服务{
@许多(mappedBy=“服务”)
私有列表过滤器;
}
这在中有描述。这个问题实际上从8天前开始就一直困扰着我,让我束手无策 问题在于如何获取列表()。所以如果您有bi-di关系,请不要执行以下操作:
Long id = getIdFromCombo();
Serving s = (Serving) session.getId(Serving.class, id).uniqueResult();
在初始化表单的同时,使用以下命令:
Public theFormName(Menu m){
this.menu = m;
}
如果菜单作为一对多服务,最好不要在会话中查询服务。最好在以下方面逐一进行匹配:
Serving s;
for(int i=0; i<this.menu.getServings().size(); i++)
{
if(equal code) s = menu.getServings().get(i);
}
s;
对于(int i=0;iit)来说,有趣的是,如果只调用getFilters(),则不会发生任何删除操作。但是,如果我开始读取筛选器,然后执行addRow(),因此将发生删除。即使我使用set,在我想要执行“get”时仍然会自动删除。请帮助…我已经相应地进行了更改,谢谢。它仍然存在:奇怪的行为存在。我已经创建了一个简单的类,用于测试获取此bi di。在获取服务的getFilter后,它仍然有效,并且我什么也没有做s已删除。但是,当我使用表单时,当它初始化时,它也可以工作,但它,Hibernate,在调用删除SQL后不久。它发生在您的代码中的某个地方。但不是在您发布的代码中。您好。谢谢。我相信是这样。现在我发现了问题。无论如何,谢谢。
Long id = getIdFromCombo();
Serving s = (Serving) session.getId(Serving.class, id).uniqueResult();
Public theFormName(Menu m){
this.menu = m;
}
Serving s;
for(int i=0; i<this.menu.getServings().size(); i++)
{
if(equal code) s = menu.getServings().get(i);
}