2017-06-07 2 views
1

Es ist ein Fremdschlüssel in meiner Einheit:Wie erstelle ich ein HashSet aus einem Set?

@Entity 
@Table(name = "role") 
public class Role { 

    @Id 
    @Column(name = "role_code") 
    private String code; 

    @Column(name = "role_lib") 
    private String lib; 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "role_menu" , joinColumns = {@JoinColumn(name = "role_code")} , inverseJoinColumns = {@JoinColumn(name = "menu_id")}) 
    @JsonManagedReference 
    private Set<Menu> menus = new HashSet<Menu>(); 

    // getters and setters 

} 

Es in Hibernate Dokumentation gesagt, die Beziehung sollte Interface seine vom Typ Attribut. Nun mein Problem ist, wenn sie mit einer Instanz dieser Klasse zu tun und mit der getMenus() Methode:

@Override 
    @Transactional 
    public Set<Menu> getListMenu(String role_code) { 

     return ((Role)get(role_code)).getMenus(); 

    } 

ich es auf ein HashSet werfen wollen, aber ich habe castException von persistenten Objekt zur Laufzeit. So, wie man es macht, HashSet zu sein?

+1

'neue HashSet (obj.getMenus());' und Sie haben sich ein HashSet aus einem Set. Aber ich stimme @ Todd zu, dass du es eher nicht brauchst. –

Antwort

1

Sie können nicht umwandeln, wenn die Implementierungen von Set nicht HashSet sind. Aber Sie können ein Objekt erstellen:

new HashSet(obj.getMenus); 

Aber es ist immer besser, Schnittstellen zu verwenden, nicht die Implementierung. Hier

ist eine Notiz von Hibernate doc:

Hibernate tatsächlich die HashSet mit einer Instanz von Hibernate eigener Implementierung von Set ersetzen. Beachten Sie die folgenden Fehler:

......

(HashSet) cat.getKittens(); // Error!

Und hier ist, warum Sie eigentlich nicht brauchen, werfen noch ein neues Objekt zu erstellen:

Die persistenten von Hibernate injiziert Sammlungen wie HashMap verhalten, HashSet, TreeMap, TreeSet oder Arraylist, abhängig von der Schnittstelle Typ.

+0

HashSet hat eine O (1) Algorithmus Komplexität, das ist der Grund :) – pheromix

+4

Sind Sie sicher, dass die Implementierung von Hibernate nicht Ihren Standards entspricht? Wenn Sie keinen fehlerhaften Test haben, versuchen Sie nicht, ihn zu beheben. –

+2

Stimme völlig mit @ C-Otto überein. Denken Sie daran: [vorzeitige Optimierung ist die Wurzel allen Übels] (http://wiki.c2.com/?PrematureOptimization). :) –

Verwandte Themen