terça-feira, 17 de abril de 2012

Utilização do Hibernate para Java - 2

No artigo anterior vimos como utilizar o Hibernate como camada de middleware entre a estrutura de classes do nosso programa Java e a representação das instâncias dessas classes numa base de dados.

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>

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>

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>

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>

--------------------------------------------------------------------------------------------


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