O artigo anterior ilustrou o mapeamento entre uma classe Java e uma tabela da BD, nomeadamente a classe Book e a tabela com o mesmo nome.
Vamos hoje ver como mapear os relacionamentos entre classes, 1-para-N e N-para-N, para a base de dados.
Vamos começar por acrescentar ao nosso modelo (que apenas tinha a classe Book) duas novas classes:
- BookCopy (Um Book contém a informação de um livro, e relaciona-se com vários BookCopy, que correspondem aos exemplares que uma biblioteca tem desse livro) --> relação 1-N.
- Author (Um Book tem vários Author e vice-versa) --> relação N-N.
No projeto Java desenvolvido no post anterior, vamos começar por acrescentar a classe BookCopy e o respetivo ficheiro de mapeamento do Hibernate BookCopy.hbm.xml.
Classe BookCopy:
Repare-se que, em BookCopy temos que declarar uma instância de Book, que corresponde ao atributo, com cardinalidade 1, importado pela relação entre Book e BookCopy.
Ficheiro BookCopy.hbm.xml:
Na classe Book, precisamos de acrescentar uma instância de Set<BookCopy>, correspondente ao atributo, de cardinalidade 0..*, importado por Book da relação entre Book e BookCopy:
Ficheiro Book.hbm.xml após alteração:
Note-se que, no ficheiro de mapeamento de Book, acrescentámos:
<set name="bookcopies" table="BOOKCOPY" inverse="true" lazy="true" fetch="select">
<key column="BOOKID" not-null="true"/>
<one-to-many class="javahibernateexample.beans.BookCopy" />
</set>
<key column="BOOKID" not-null="true"/>
<one-to-many class="javahibernateexample.beans.BookCopy" />
</set>
correspondente aos bookcopies associados a um dado Book.
E, no ficheiro de mapeamento de BookCopy, colocámos:
<many-to-one name="book" class="javahibernateexample.beans.Book" fetch="select">
<column name="BOOKID" not-null="true" />
</many-to-one>
<column name="BOOKID" not-null="true" />
</many-to-one>
correspondente ao book associado a um dado BookCopy.
--------------------------------------------------------------------------------------------
Vamos, agora, acrescentar a informação relativa aos autores.
Para isso, vamos criar a classe Author:
E o respetivo ficheiro de mapeamento do Hibernate Author.hbm.xml:
A classe Book precisa, agora, de fazer referência aos autores do livro, através de um atributo de tipo Set<Author>:
No final, o ficheiro Book.hbm.xml fica com o seguinte conteúdo:
Note-se o atributo authors, em Book:
<set name="authors" table="BOOKAUTHOR" cascade="all">
<key column="BOOKID" />
<many-to-many column="AUTHORID" class="javahibernateexample.beans.Author" />
</set>
<key column="BOOKID" />
<many-to-many column="AUTHORID" class="javahibernateexample.beans.Author" />
</set>
e o correspondente atributo books em Author:
<set name="books" table="BOOKAUTHOR" cascade="all">
<key column="AUTHORID" />
<many-to-many column="BOOKID" class="javahibernateexample.beans.Book" />
</set>
<key column="AUTHORID" />
<many-to-many column="BOOKID" class="javahibernateexample.beans.Book" />
</set>
--------------------------------------------------------------------------------------------
Falta, ainda, acrescentar os novos recursos ao ficheiro hibernate.cfg.xml:
Podemos agora usar a insfraestrutura criada em alguns casos de teste:
Alguns resultados dos testes:
Por fim, podemos alterar, no ficheiro de configuração, a property hibernate.show_sql para false, o que esconderá do output todo o sql gerado pelo hibernate:
Output dos testes com o show_sql a false:
Espero que este exemplo vos permita começar a usar o hibernate nos vossos projetos.
Sem comentários:
Enviar um comentário