我有一个带有子实体列表的 JPA 实体。在这种情况下,一个附加了角色的用户实体。
它看起来(有点简化 - 省略了一些字段/方法)如下:
@Entity
public class MyUser{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long myUserId;
private String username;
@OneToMany
@JoinTable(name = "userrole",
joinColumns = {
@JoinColumn(name="myUserId", unique = true)
},
inverseJoinColumns = {
@JoinColumn(name="roleId")
}
)
private Collection<Role> roles;
public Collection<Role> getRoles() {
return roles;
}
}
如果感兴趣,角色实体非常简单。
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleId;
private String role; // a few more string fields here .
当我添加两个用户和每个用户几百个角色时,当我列出用户时,我会得到一个奇怪的行为。每个用户都列出了几百次(相同的用户 = 相同的唯一 ID)。
有问题的代码:
Query q = em.createQuery("SELECT u FROM MyUser u LEFT JOIN FETCH u.roles");
Collection<MyUser> users = q.getResultList();
for(MyUser u : users){
// print/use u here
}
但是,当我只是访问数据库并执行 select 语句时,它似乎很好。每个用户只存在一次。
在这种情况下,我将 OpenJPA 1.2 与 IBM DB2 数据库一起使用。