2013-03-06 2 views
1

소프트웨어태그의 두 클래스가 있다고 가정 해 보겠습니다. 소프트웨어는 많은 태그와 관련 될 수 있으며 각 태그는 많은 소프트웨어와 관련 될 수 있습니다. 그래서 다 대 다 관계가 있습니다.many to many and heavy add operation

우리는 최대 절전 모드 및 주석 사용 : 우리는 소프트웨어로 기존의 태그를 추가 할 때

@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 소프트웨어와 관련이 추가 태그는 다음 순간에 우리가 (sofware)tag.add를 호출 할 경우, 태그 클래스는 단지 추가하기 위해 메모리에 모든 소프트웨어를 다운로드합니다 그것에 하나의 소프트웨어. 권리?

질문 : 이것을 피하는 가장 좋은 방법은 무엇입니까?

답변

1

Hibernate는 객체 지향 방식으로 데이터베이스 스키마에 대해 생각할 수있게 해준다. 그러나 합리적으로 복잡하거나 합리적으로 큰 데이터를 가져올 때 현실적인 데이터베이스 현실을 염두에 두어야합니다. 데이터베이스의 다 대다 realtionship은 태그를 나타내는 테이블과 소프트웨어를 나타내는 테이블에 대한 외래 키가있는 별도의 테이블로 구현됩니다. 귀하의 상황에서, 나는 SoftwareTag 클래스를 추가하여 다 - 대 - 다 매핑 테이블을 표현하고, Software 클래스를 SoftwareTags 목록으로 변경하고, 클래스 태그에서 콜렉션을 제거합니다. 귀하의 비즈니스 로직을 기반으로 일부 findBy 메서드를 DAO에 추가해야하지만 사소한 것이어야합니다.