我有几个实体bean,其他实体集作为属性。我想对它们进行排序并保证在每次插入时它们都会保持排序状态。 我试过这种方式:
@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
)并重新发布项目,一切正常,我得到一组中的所有元素(当然没有排序)。
有人可以帮我找出我的排序有什么问题吗?
答案 0 :(得分:1)
我假设getIdDocument()返回一个对象而不是一个原语。
在这种情况下,您需要使用equals而不是==
public boolean equals(Object d) {
return (getIdDocument().equals((Document)d).getIdDocument());
}
修改强>
看起来问题出在compareTo()方法的第二个if(data2 < data1)
语句中。这应该是if(data1 < data2)