java - 如何从 Set 创建 HashSet?

标签 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呢?

最佳答案

如果 Set 的实现不是 HashSet,则无法进行转换。但你可以创建一个对象:

new HashSet(obj.getMenus);

但是使用接口(interface)总是比使用实现更好。

这是来自 Hibernate doc 的注释:

Hibernate will actually replace the HashSet with an instance of Hibernate's own implementation of Set. Be aware of the following errors:

......

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

这就是为什么您实际上不需要强制转换也不需要创建新对象:

The persistent collections injected by Hibernate behave like HashMap, HashSet, TreeMap, TreeSet or ArrayList, depending on the interface type.

关于java - 如何从 Set 创建 HashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415385/

相关文章:

java - 使用 SAX 的状态模式

java - 在 Java 中的 List 或 Map 上调用 size() 的开销是多少?

java - 为什么要使用 session.beginTransaction & transaction.commit

java - Spring事务注解回滚测试好像不太顺利

java - 找到最长的递减序列

java - 如何在数组中使用 toString

java - Struts 2 验证错误

java - hibernate envers 对多对多关系的删除操作未得到审核

java - com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException : No operations allowed after connection closed

java - JPA/Hibernate (PSQL) 不创建连接表