加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Criteria.DISTINCT_ROOT_ENTITY不会阻止重复的对象

发布时间:2020-12-14 17:46:49 所属栏目:Java 来源:网络整理
导读:我有以下道法: @Overridepublic ListAdminRole findAll() { Session session = sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria(AdminRole.class); criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); retur
我有以下道法:
@Override
public List<AdminRole> findAll() {
    Session session = sessionFactory.getCurrentSession();
    Criteria criteria = session.createCriteria(AdminRole.class);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return criteria.list();
}

其实我想从数据库检索所有条目.

有时我看到重复.当我用AdminRole添加用户时,会发生这种情况.

我已经看到,这是可能的,当我使用EAGER提取类型,这应该是修复添加以下行:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

但这并不能帮助我.

我的映射:

@Entity
@Table(name = "terminal_admin_role")
public class AdminRole {

    @Id
    @Column(name = "role_id",nullable = false,unique = true)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "user_id")
    @SequenceGenerator(name = "user_id",sequenceName = "user_id")
    private Long adminId;

    @Column(name = "role")
    private String role;

    public AdminRole(String role) {
        this.role = role;
    }

    public AdminRole() {
    }

    // get set

    @Override
    public String toString(){
        return role;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof AdminRole)) {
            return false;
        }

        AdminRole adminRole = (AdminRole) o;

        if (!role.equals(adminRole.role)) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        return role.hashCode();
    }
}

@Entity
@Table(name = "terminal_admin")
public class TerminalAdmin {
    @ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinTable(name = "admin_role",joinColumns = { 
        @JoinColumn(name = "admin_id",nullable = false) },inverseJoinColumns = { @JoinColumn(name = "role_id",nullable = false) })
    private Set<AdminRole> adminRoles;      
    //...
}

附:

我无法切换提取类型.

我不想把这个列表放在一起.

解决方法

没有理由使用DISTINCT_ROOT_ENTITY或任何类似的东西,你需要的是:
session.createCriteria(AdminRole.class).list();

如果你重复,那么你真的有数据库.检查直接或从其他实体级联保存AdminRoles的代码.

当从其他实体级联PERSIST / MERGE操作时,请确保操作级联到持久/分离的AdminRole实例,而不是临时(新的)实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读