Dúvidas sobre categorização de entidades

8 respostas
greati

Olá,

Desculpem se o título não foi muito descritivo, mas a dúvida é esta:

Eu tenho, no meu banco de dados, uma tabela Livros e outra Categoria_Livro. A tabela Livros possui um atributo livro_idCategoria, que refere-se ao atributo cat_id da tabela Categoria_Livro.
Minha dúvida surge quando preciso representar isso nas classes Java.

Eu criei uma classe Livro e uma classe CategoriaLivro. Eu devo fazer:

public class Livro {
...
private CategoriaLivro categoria;
...
}

Ou:

public class Livro {
...
private int idCategoria;
...
}

A dúvida veio principalmente porque estou tentando mapear com as Annotations da JPA para o Hibernate… Se alguém puder me explicar como faço isso direitinho também, ficarei agradecido.

Obrigado.

8 Respostas

xandevieira

os dois

Rafael_Guerreiro

Faça o primeiro e anote-o com:
@ManyToOne se quiser fazer N-1
OU
@OneToOne se quiser fazer 1-1

greati

Hum, beleza.

Só mais uma coisa: no método do DAO para buscar livros por categoria, eu faço:

public List<Livro> listaLivrosPorCategoria(CategoriaLivro categoria){
...
}

?

Rafael_Guerreiro

Nesse caso, o que fizer mais sentido para você…

Mas a forma de acessar esse atributo vai ser:

("livro.categoria.id", idCategoria)
// OU
("livro.categoria.id", categoria.getId())
greati

Ah, entendi, valeu!

greati

Rafael,

Como eu faria então o mapeamento do atributo categoria?

@Column(name="livro_idCategoria")
    @ManyToOne
    @JoinColumn(name="cat_id") //o que eu coloco aqui,  que categoria não é int?
    public CategoriaLivro getCategoria() {
        return categoria;
    }
    public void setCategoria(CategoriaLivro categoria) {
        this.categoria = categoria;
    }
Rafael_Guerreiro

Então, categoria não é int, mas é como se fosse :smiley:

Assim, na tabela ele é um int, o Hibernate sabe que ele é um int quando vc anota com @ManyToOne ou @OneToOne, então, você deve mapeá-lo para o int que você tem no banco.

Assim:

//@Column(name="livro_idCategoria") // NAO PODE USAR @COLUMN COM @ManyToOne, @OneToOne, @OneToMany e @ManyToMany, quando essas anotações estiverem presente, use @JoinColumn @ManyToOne @JoinColumn(name="livro_idCategoria") public CategoriaLivro getCategoria() { return categoria; }

greati

Ah, genial!

Obrigado de novo :slight_smile:

Criado 15 de maio de 2013
Ultima resposta 15 de mai. de 2013
Respostas 8
Participantes 3