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