子エンティティのリストを持つ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;
}
}
ストレスを感じる場合、Roleエンティティは非常に単純です。
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleId;
private String role; // a few more string fields here .
2人のユーザーとユーザーごとに数百のロールを追加すると、ユーザーを一覧表示するときに奇妙な動作が発生します。各ユーザーは数百回リストされます(同じユーザー=同じ一意の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ステートメントを実行するだけでは、問題ないようです。すべてのユーザーは一度だけ存在します。
この場合、OpenJPA1.2をIBMDB2データベースと一緒に使用します。