繁体   English   中英

Spring GrantedAuthorities和相关对象的休眠问题

[英]Hibernate problems with Spring GrantedAuthorities and related objects

我已经开始将Hibernate与SpringSecurity和GrantedAuthorities一起使用。

查询数据库时,我现在得到错误的结果。

用户:

@Entity
@Table
public class User implements UserDetails {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true, nullable = false)
    private String username;

    @Column(nullable = false)
    private String password;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
        name = "user_authorities",
        joinColumns = @JoinColumn(name = "userid"),
        inverseJoinColumns = @JoinColumn(name = "authority")
    )
    private List<Authority> authorities = new ArrayList<>();

    @OneToMany(mappedBy = "owner")
    private List<Order> orders = new ArrayList<>();
}

权威:

@Entity
@Table
public class Authority implements GrantedAuthority {

    @Id
    @Column(unique = true, nullable = false)
    private String authority;

    @ManyToMany(mappedBy = "authorities")
    private List<User> users = new ArrayList<>();
}

订购:

@Entity
@Table(name = "Orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "owner_id")
    private User owner;
}

问题在于,Hibernate现在多次列出所有Orders ,具体取决于User拥有多少个Authorities

如果User具有3个Authorities和2个Orders ,则以下6个对象将出现在我的DAO中:

+----------+---------+------------+
| Order id | User id | Authority  |
+----------+---------+------------+
|        1 |       1 | ROLE_USER  |
|        1 |       1 | ROLE_ADMIN |
|        1 |       1 | ROLE_TEST  |
|        2 |       1 | ROLE_USER  |
|        2 |       1 | ROLE_ADMIN |
|        2 |       1 | ROLE_TEST  |
+----------+---------+------------+

这是相关的Hibernate查询:

@Transactional(readOnly = true)
public List<Order> getOrdersForUser(User user) {

    return sessionFactory.getCurrentSession()
            .createCriteria(Order.class)
            .add(Restrictions.eq("owner", user))
            .list();

}

有人可以提供有关此行为的见解吗? 我认为这不是Hibernate的工作方式。

您可以尝试:

return sessionFactory.getCurrentSession()
        .createCriteria(Order.class)
        .add(Restrictions.eq("owner", user))
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();

看看这个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM