I know similar questions have been asked before, I looked through them but still can’t figure out why in particulary this case sorting is not working. I have 2 Entities – Category and Transaction with relations OneToMany. Inside one category there can be many transactions and One transaction belongs to certain category. When I fetch the category from DB I want all related transactions to be fetch in sorted order – for that I am using SortedSet as interface of the collection of TXs and TreeSet as implementation – this should tell Hibernate to use proper data structure. Also I am using @SortNatural HIbernate’s annotation and offcourse Transaction entity implements Comparable – to define the sorting order (sorting by Long ID in natural order). NB – equals & hashcode are NOT overriden as it not required by definition of TreeSet. For some reason when I fetch the Category and its transactions on front-end – they are displayed in “random” order every time I refresh the page. PLease advise what is wrong here. I referred to Hibernate docs regarding SortedSet – please see the link Hibernate SortedSet
@Entity
@Table(name = "category")
public class Category implements Comparable<Category> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "bedget")
private BigDecimal budget;
@Column(name = "name")
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "groupp_id")
private Group groupp;
@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "category")
@SortNatural
private SortedSet<Transaction> transactions = new TreeSet<>();
//getters - setters
@Entity
@Table(name = "transaction")
public class Transaction implements Comparable<Transaction>{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
@Column(name = "total")
private BigDecimal total;
@Column(name = "type")
private String type;
@Column(name = "note")
private String note;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
// getters-setters
@Override
public int compareTo(Transaction o) {
return Long.compare(this.id, o.id);
}
Advertisement
Answer
Problem solved. Found that SortedSet was wrapped into Unmodifiable Set in busness layer during results filtering (stream) and Unmodifiable Set doesn’t preserve iteration order.