-
Persistence Provider: JBoss Hibernate
I have an entity with a one-to-many association. For my business logic, I want the collection implementation type to be a TreeSet as I can sort it.
@Entity
public class Foo1 {
@Id
private Long id;
@OneToMany(mappedBy="foo1");
Set foo2s;
public void addFoo2(Foo2 foo2) {
if (foo2s == null) {
this.foo2s = new TreeSet();
}
this.foo2s.add(foo2);
}
...
}
Let's say I persist the entity and so it becomes managed. When the entity becomes managed, the persistence provider replaces the collection implementation with its custom implementation org.hibernate.collection.PersistentSet. Now if I do any TreeSet operation on my collection, it does not work as the collection implementation type is not a TreeSet anymore.
foo1.getFoo2s().first() //throws exception.
But I do want my collection implementation to be a TreeSet even in a managed entity. I know I can not cast org.hibernate.collection.PersistentSet to java.util.TreeSet.
Why do we have such restriction in implementation? Why can't the persistence provider (Hibernate) use TreeSet as the implementation type?
I do not want my code to be dependent on vendor-specific implementation like PersistentSet or PersistentSortedSet. Is there a solution to this? Is there a way to use a java.util.* collection implementation in a managed entity?
I would appreciate any help.
Thanks
Vignesh
-
Use SortedSet instead of Set.
try
SortedSet foo2s;
-
Thanks for your reply.
I did try SortedSet earlier but it throws exception on server startup.
Illegal attempt to map a non collection as a @OneToMany
It does not allow to declare anything other than root java.util collection interface type ie., Collection, Set, Map and List.
Earlier I did not mention that I am using Hibernate implementation of JPA.