Hibernate 休眠多对多和重添加操作
假设我们有两个类:软件和标签。 软件可以与许多标签相关,每个标签可以与许多软件相关。 所以,我们有多对多的关系 我们使用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")
@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);
}
...
}