Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate 休眠多对多和重添加操作_Hibernate_Optimization_Jpa_Proxy_Many To Many - Fatal编程技术网

Hibernate 休眠多对多和重添加操作

Hibernate 休眠多对多和重添加操作,hibernate,optimization,jpa,proxy,many-to-many,Hibernate,Optimization,Jpa,Proxy,Many To Many,假设我们有两个类:软件和标签。 软件可以与许多标签相关,每个标签可以与许多软件相关。 所以,我们有多对多的关系 我们使用Hibernate和注释: @Entity class Software .. { @ManyToMany public List<Tag> tags = new LinkedList<Tag>(); ... } @Entity class Tag .. { @ManyToMany(mappedBy = "tags")

假设我们有两个类:软件标签。 软件可以与许多标签相关,每个标签可以与许多软件相关。 所以,我们有多对多的关系

我们使用Hibernate和注释:

@Entity
class Software .. {
    @ManyToMany
    public List<Tag> tags = new LinkedList<Tag>();
    ...
}

@Entity
class Tag .. {
    @ManyToMany(mappedBy = "tags")
    List<Software> softwares = new LinkedList<Software>();
    ... 
}
如果这个添加标签已经与1000万个软件相关,那么现在我们调用tag.add(sofware),tag类将把所有这些软件下载到内存中,以便只向其中添加一个软件。对吧?


问题:如何避免这种情况的最佳实践是什么?

Hibernate允许您以面向对象的方式考虑数据库模式。但是,当您接触到相当复杂或相当大的数据时,您仍然应该记住真实的数据库。数据库中的多对多关系将作为一个单独的表来实现,表中的外键表示标记,表中的外键表示软件。对于您的情况,我会添加一个类SoftwareTag来表示多对多映射表,将类Software更改为包含在SoftwareTag列表中,并从类标记中删除任何集合。根据您的业务逻辑,您可能需要向DAO添加一些findBy方法,但这应该很简单

Hibernate允许您以面向对象的方式考虑数据库模式。但是,当您接触到相当复杂或相当大的数据时,您仍然应该记住真实的数据库。数据库中的多对多关系将作为一个单独的表来实现,表中的外键表示标记,表中的外键表示软件。对于您的情况,我会添加一个类SoftwareTag来表示多对多映射表,将类Software更改为包含在SoftwareTag列表中,并从类标记中删除任何集合。根据您的业务逻辑,您可能需要向DAO添加一些findBy方法,但这应该很简单

class Software {
  ...
  public void add(Tag tag) {
    tags.add(tag);
    tag.add(software); 
  }
  ... 
}