Com o uso de ferramentas que automatizam a forma ao qual os dados são gravados no banco de dados, o processo de modelar o banco de dados ( o famoso esquema lógico/físico, modelo relacional) acabou ficando obsoleto, o que torna prejudicial para o desenvolvimento de um projeto.

Banco de Dados
Uma destas ferramentas é o Hibernate, que auxilia o desenvolvedor JAVA a não se preocupar com esta etapa de modelagem fazendo com que ele ganhe tempo para exercer outras atividades, mas para garantir este benefício é necessário utilizar a ferramenta da maneira correta para que ela não torne assim um vilão no decorrer do seu projeto. Em O.O existe a necessidade de dividir as reponsabilidades, não deixando uma classe sobrecarregada para gerenciar todos os recursos de uma aplicação.
[notice]Vale apena ter uma tabela com várias colunas do que um modelo com várias tabelas especializadas[/notice]
Em uma modelagem relacional vale apena ter uma tabela com várias colunas do que um modelo com várias tabelas especializadas, pois minimiza a quantidade de joins para obter um resultado. Exemplo:
@Entitypublic class Servico { @Id @GeneratedValue private Int id; private String nome; private Double preco; private Date inicioPromocao; private Date fimPromocao; // getters e setters
}@Entitypublic class Promocao { private Date inicio; private Date fim; // getters e setters}Se quiser saber se uma promoção é aplicável a um serviço e por quantos dias podemos aproveitar uma promoção. Colocar esse código dentro de um controlador não parece uma boa idéia. Seria necessário colocar esta situação em outro lugar. Criando assim a classe Intervalo:
public class Intervalo { private Date inicio; private Date fim;} |
O Servico e a Promocao invés de guardar informações com vários Dates, passa a guardar informação de um Intervalo:
@Entitypublic class Servico { @Id @GeneratedValue private Int id; private String nome; private Double preco; private Intervalo periodoPromocao; }@Entitypublic class Promocao { private Intervalo promocao; } |
A criação da classe Intervalo traz vários benefícios, assim como unir dados e comportamentos:
public class Intervalo { private Date inicio; private Date fim; public int getDias() {...} public Intervalo juncaoCom(Intervalo i) {...}} |
[warning]Criar uma tabela e referenciar seus registros através de chaves estrangeiras nas tabelas Servico e Promocao só trará a necessidade de joins.[/warning] |
Mapeando a classe Intervalo. Criar uma tabela e referenciar seus registros através de chaves estrangeiras nas tabelas Servico e Promocao só trará a necessidade de joins. Criando uma classe Embeddableseus atributos serão colunas na tabela da entidade que tem o atributo anotado com @Embedded.
@Embeddablepublic class Intervalo { //...}@Entitypublic class Promocao { @Embedded private Intervalo promocao; // a tabela Promocao terá uma coluna inicio e outra fim // ...} |
É importante conhecer os demais recursos do Hibernate que nos garante em não precisar adequar nossas entidades às nossas tabelas, nem de adequar nossas tabelas às nossas entidades. Há ainda o suporte a herança, nomenclatura das tabelas, chaves compostas, colunas, além de tipos definidos pelo usuário para diferentes banco de dados.
Fonte: Caelum.






