2012-01-08 2 views
0

다른 엔티티 세트가 속성으로 포함 된 몇 개의 엔티티 bean이 있습니다. 나는 그들을 분류하고 삽입 할 때마다 정렬 된 상태로 유지되도록하고 싶습니다. 이 방법을 시도 :TreeSet을 사용하여 JPA 엔티티를 정렬하는 방법

@Entity 
@Table(name = "Document") 
public class Document implements Serializable, Comparable<Document> { 

    ... 

    @ManyToOne 
    private Project relativeProject; 

    ... 

    @Override 
    public int compareTo(Document d) { 
     long data1 = getDate().getTimeInMillis(); 
     long data2 = d.getDate().getTimeInMillis(); 
     if(data1 > data2) 
      return 1; 
     else 
      if(data2 < data1) 
       return -1; 
      else 
       return 0; 
    } 

    @Override 
    public boolean equals(Object d) { 
     return (getIdDocument() == ((Document)d).getIdDocument()); 
    } 

    @Override 
    public int hashCode() { 
     return Long.valueOf(getIdDocument()).hashCode(); 
    } 

} 




@Entity 
@Table(name="Project") 
public class Project implements Serializable, Comparable<Project> { 

    ... 

    @OneToMany(mappedBy="relativeProject", fetch = FetchType.EAGER) 
    @Sort(type = SortType.NATURAL) 
    private SortedSet<Document> formedByDocuments; 

    public Progetto() { 
     this.formedByDocuments = new TreeSet<Document>(); 
    } 

    ... 

} 

하지만 작동하지 않습니다. 문제는 데이터베이스에 필요한 항목이 모두있는 경우에도 세션 빈이 Project을 반환하면 Document을 놓칠 수 있다는 것입니다. 또한 항목은 데이터베이스에서 전혀 정렬되지 않습니다.
전혀 정렬하지 않고 (HashSet 사용) 프로젝트를 다시 게시하면 모든 것이 제대로 작동하고 집합의 모든 요소를 ​​얻을 수 있습니다 (물론 정렬 할 수는 없습니다).
누군가 내 분류 작업에서 잘못된 점을 발견하도록 도와 줄 수 있습니까?

+1

작은 의견이지만 코드에서 영어 이름을 사용할 수 있습니다. 이렇게하면 코드를 다른 사람들과 훨씬 쉽게 공유 할 수 있습니다 (예 : 여기). 내가 'progettoRelativo'와 같은 것을 읽을 때 그것은 코드를 모호하게 만든 것처럼 보입니다. 거기에 "jkgdklgflkg"를 넣을 수도 있습니다. 나는 많은 사람들이 같은 방식으로 느끼고 이것이 좋은 대답을 얻는 기회를 낮출 수 있다고 생각합니다. –

+0

죄송합니다. 나는 그것이 여전히 명확하다고 생각했다. (Documento -> Document, Progetto -> Project) 그러나 나는 복잡한 단어가 있다고 생각하지 않았다. – Simon

+0

문서의 경우 equals() 및 hashCode() 메소드도 게시하십시오. – Andre

답변

1

저는 getIdDocument()가 원시 객체가 아니라 객체를 반환한다고 가정합니다.

는이 경우, 당신은 등호를 사용하고 ==하지 할 필요가

public boolean equals(Object d) { 
    return (getIdDocument().equals((Document)d).getIdDocument()); 
} 

편집 : 문제가 compareTo와() 메서드의 두 번째 if(data2 < data1) 성명에서처럼

보인다. 이것은되어야합니다 if(data1 < data2)

+0

'long '타입이므로'=='이 좋습니다. 어쨌든, 나는 다음과 같이 글을 풀었다.'if (data1> data2) return 1; 그렇지 않으면'compareTo()'에 -1;을 반환합니다. 그러나 나는 왜 그런지 이해하지 못합니다. – Simon

+1

compareTo()를 단순화하면 어떨까요? 'return getDate(). compareTo (d.getDate()); ' – Andre

+0

여전히 작동 중입니다. 그러나 두 날짜 간의 "수동"비교가 왜 효과가 없었는지 이해하지 못합니다. – Simon

관련 문제