Pessoal, estou com uma dúvida conceitual.
Caso eu tenha a classe Usuario:
@Entity
public class Usuario implements Serializable {
@Id
private String username;
private String password;
@Column(name = "enable", columnDefinition = "BOOLEAN")
private boolean enable;
@OneToMany
private List<Autorizacao> autorizacoes;
public Usuario() {
}
//getters and setters
}
e a classe Autorizacao:
@Entity
public class Autorizacao implements Serializable {
@Id
private String nome;
public Autorizacao() {
}
//getter and setter
}
quando eu fizer a busca do Usuario, virá uma lista de Autorizacao já preenchido?
Ou eu tenho que realizar uma busca das Autorizações e depois dar um set no Usuario?
Obrigado
Executa e posta o resultado …
mais facil
Sardinha,
Os objetos relacionados são obtidos na primeira consulta que você fizer, ou seja, quando você buscar um Usuário as suas Autorizações serão acessadas também.
Entretanto, é importante entender que o JPA funciona com dois tipos de relacionamentos: LAZY e EAGER.
Quando o relacionamento é definido como LAZY (default) somente o objeto principal é recuperado. Se você tentar acessar a lista de autorizações após ter fechado a sessão do JPA, uma exceção será lançada. O que é preciso fazer é acessar a lista de autorizações ANTES de fechar a sessão do JPA.
No tipo EAGER os objetos “pendurados” são recuperados, mesmo que você não vá utilizá-los. Você deve definir EAGER em casos muito específicos.
É importante resslatar que a sessão do JPA normalmente é aberta e facheda em uma classe DAO (Data Access Object) e é lá que você deve fazer o acesso à lista antes de fechar a sessão (pode ser um simples usuario.getAutorizacoes().size() ).
O EAGER é configurado na anotação @OneToMany, conforme o exemplo abaixo:
@OneToMany(mappedBy = "autorizacoes",cascade=CascadeType.ALL, fetch= FetchType.EAGER)
private List<Autorizacao> autorizacoes;
O LAZY é o default e não precisa ser definido.
Será que é isso?
Olá armeniocardoso,
muito obrigado pela explicação. Era exatamente isso.
Porém o meu relacionamento é @ManyToMany e tirei o mappedby. Esta correto?
@Entity
public class Usuario implements EntidadeBase{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Id
private String username;
private String password;
@Column(name = "enable", columnDefinition = "BOOLEAN")
private boolean enable;
@ManyToMany(cascade=CascadeType.ALL, fetch= FetchType.EAGER)
private List<Autorizacao> autorizacoes;
//get e set
}
A classe Autorizacao não mudou
Você sabe algum material bom sobre JPA ?
Não sardinha,
a classe Usuario deve ter a anotação conforme o armeniocardoso citou:
[code]# @OneToMany(mappedBy = “usuario”,cascade=CascadeType.ALL, fetch= FetchType.EAGER)
private List autorizacoes; [/code]
já a classe Autorizacao deve ter o campo usuario com o mapeamento ManyToOne:
@ManyToOne()
@JoinColumn(name="autorizacao_id")
private Usuario usuario;
[quote=renovisk]Não sardinha,
a classe Usuario deve ter a anotação conforme o armeniocardoso citou:
[code]# @OneToMany(mappedBy = “usuario”,cascade=CascadeType.ALL, fetch= FetchType.EAGER)
private List autorizacoes; [/code]
já a classe Autorizacao deve ter o campo usuario com o mapeamento ManyToOne:
@ManyToOne()
@JoinColumn(name="autorizacao_id")
private Usuario usuario;
[/quote]
Mas o problema é que 1 Usuário pode ter N Autorização e o contrário também.
Não estou conseguindo mapear isso.