Dúvia na busca JPA (objetos compostos)

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 … :wink: 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&lt;Autorizacao&gt; 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.