1

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

我们使用 Hibernate 和注解:

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

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

然后,每次我们想将现有标签添加到软件时,我们都需要将这个软件添加到该标签(以保持正确的多对多结构)。像这样:

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

如果这个添加标签已经关联了 1000 0000 个软件,那么此时我们调用tag.add(sofware),Tag 类会将所有这些软件下载到内存中,以便只添加一个软件。对?

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

4

1 回答 1

1

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

于 2013-03-06T15:03:23.050 回答