java - Spring GrantedAuthorities 和相关对象的 Hibernate 问题

标签 java mysql spring hibernate spring-security

我开始将 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

如果用户有3个权限和2订单,则以下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();

看看这个 answer

关于java - Spring GrantedAuthorities 和相关对象的 Hibernate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681655/

相关文章:

java - 允许 ID = 0 与 Hibernate ("eclipselink.id-validation"= "NULL"等效)

php - 如何从mysql中的逗号分隔列值进行搜索

mysql : make mysql db to be case sensitive for queries

java - Spring Bean 创建异常

java - Java中的break语句

java - 具有动态部分的 RecyclerView

java - 当存在 XML 注释而不是元素时,Jackson XML 反序列化失败

mysql - 我可以使用 JOIN 而不是子查询来获取 MySQL 中各个表的 COUNT() 吗?

java - 外部tomcat中spring的SSL配置

java - 错误 beanFactory/ApplicationContext - JAVA