Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate自动删除多对多关系_Java_Hibernate_Postgresql - Fatal编程技术网

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