2012-01-08 7 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>(); 
    } 

    ... 

} 

をしかし、それは動作しません。問題は、たとえデータベースにすべての必要なエントリがあっても、セッションBeanが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

まだ動作しています。しかし、私は2つの日付間の私の "マニュアル"の比較がうまくいかなかった理由を理解していません。 – Simon

関連する問題