我的实体中有一个外键:
@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
?
答案 0 :(得分:1)
如果Set
的实施不是HashSet
,则无法投射。但是你可以创建一个对象:
new HashSet(obj.getMenus);
但是使用接口总是更好,而不是实现。
以下是来自Hibernate doc的说明:
Hibernate实际上会用一个实例替换HashSet Hibernate自己的Set实现。请注意以下事项 错误:
...
(HashSet)cat.getKittens(); //错误!
这就是为什么你实际上不需要强制转换或创建新对象的原因:
Hibernate注入的持久集合的行为类似于HashMap, HashSet,TreeMap,TreeSet或ArrayList,具体取决于接口 类型。