Hibernar muitos para muitos - buscar método ansioso vs preguiçoso

Novo no Hibernate.

Tenho grupo de usuários muitos para muitos relação. Três tabelas: tabela de mapeamento de usuário, grupo e grupo de usuários.

Entidades:

@Entity
@Table(name = "user")
public class User {

@Id
@Column (name = "username")
private String userName;

@Column (name = "password", nullable = false)
private String password;


@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable(name="usergroup", 
            joinColumns={@JoinColumn(name="username")}, 
            inverseJoinColumns={@JoinColumn(name="groupname")})
private Set<Group> userGroups = new HashSet<Group>();

... setter and getters



@Entity
@Table(name = "group")
public class Group {

@Id
@Column(name = "groupname")
private String groupName;

@Column(name = "admin", nullable = false)
private String admin;

@ManyToMany(mappedBy = "userGroups", fetch = FetchType.EAGER)
private Set<User> users = new HashSet<User>();

... setter and getters

Observe que na Entidade de Grupo estou usando o método de busca EAGER. Agora, quando estou chamando meu DAO para recuperar todos os grupos no sistema usando os seguintes critérios:

  Criteria criteria = session.createCriteria(Group.class);
  return criteria.list();

Estou recebendo todas as linhas da tabela mappgin (usergroup) em vez de obter o número real de grupos ...

por exemplo, se eu tiver na tabela do usuário

 username password
 -----------------
 user1     user1
 user2     user2

na tabela de grupo

 groupname admin
 ---------------
 grp1      user1
 grp2      user2

na tabela de grupo de usuários

 username groupname
 ------------------
 user1     grp1
 user2     grp2
 user1     grp2
 user2     grp1

O resultado será a seguinte lista - {grp1, grp2, grp2, grp1}

Em vez de {grp1, grp2}

Se eu mudar na Entidade de Grupo, o método de busca para LAZY, estou obtendo os resultados corretos, mas o hibernate lança LazyException em outro local ...

Por favor, ajude o método de busca que devo usar e por quê?

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion