如何从Set创建HashSet?

时间:2017-06-07 14:24:28

标签: java hibernate

我的实体中有一个外键:

@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

}

在Hibernate文档中说,关系属性应该是Interface类型。现在我的问题是在处理这个类的实例并使用getMenus()方法时:

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

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

    }

我想将它转换为HashSet,但我在运行时获得了持久对象的castException。那么如何让它成为HashSet

1 个答案:

答案 0 :(得分:1)

如果Set的实施不是HashSet,则无法投射。但是你可以创建一个对象:

new HashSet(obj.getMenus);

但是使用接口总是更好,而不是实现。

以下是来自Hibernate doc的说明:

  

Hibernate实际上会用一个实例替换HashSet   Hibernate自己的Set实现。请注意以下事项   错误:

     

...

     

(HashSet)cat.getKittens(); //错误!

这就是为什么你实际上不需要强制转换或创建新对象的原因:

  

Hibernate注入的持久集合的行为类似于HashMap,   HashSet,TreeMap,TreeSet或ArrayList,具体取决于接口   类型。