2013-03-06 42 views
1

假设我们有两个类:软件标签。 软件可能与许多标签有关,每个标签可能与许多软件有关。 所以,我们有多对多的关系。休眠多对多,重加操作

我们使用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),标签类将下载所有这些软件到内存中以便只需添加一个软件。对?

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

回答

1

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