terça-feira, 26 de abril de 2011

Mapeamento Objeto Relacional


1. Conceitos Gerais de Persistência
Imagine um usuário fazendo uso de uma ap
licação, por exemplo, um sistema para controlar suas finanças. Ele passa a fornecer como dados de entrada todos os seus gastos mensais para que a aplicação lhe gere, por exemplo, gráficos nos quais ele possa avaliar seus gastos. Finalizada, a sua análise financeira, o usuário resolve desligar o computador em que a aplicação se enc
ontra. Imagine agora que o usuário teve novos gastos, voltou a ligar o computador, acessou novamente o sistema de finanças e que gostaria de realizar novas
análises com todos os seus gastos acumulados. Se a aplicação não armazenar, de alguma forma, os primeiros gastos fornecidos, o usuário teria que informá-los novamente e em seguida, acrescentar os novos gastos para fazer a nova análise, causando grande trabalho e o sistema não sendo eficiente. Para resolver esse tipo de problema, uma solução seri
a armazenar (persistir) os dados lançados a cada vez pelo usuário em um banco de dados relacional, utilizando SQL (Structured Query Language).

2. Mapeamento Objeto Relacional
Seção Escrita Por: Juliano Rafael Sena de Araújo
Por vários anos os projetos de ap
licações corporativas tiveram uma forte necessidade de se otimizar a comunicação da lógica de negócio com a base de dados. Essa necessidade ganhou mais intensidade com o crescimento dessas aplicações, crescimento esse, tanto em requisitos (funcionalidade) quanto em
volume de dados armazenados em seu banco de dados.
Na década de 80, foram criados os bancos de dados rel
acionais (BDR) que substituíram as bases de dados de arquivos. Para esse tipo de base de dados foi criada uma linguagem, a SQL. Essa linguagem foi to
da baseada na lógica relacional e por isso contava com diversas otimizações em suas tarefas se comparadas com as outras tecnologias existentes. A partir de então foi diminuído o tempo gasto para
as operações de persistência, mesmo com um grande volume de dados. Entretanto, essa linguagem não propiciava aos desenvolvedores uma facilidade para que a produtividade fosse aumentada.
Uma solução que surgiu no início da década de 90 foi à criação de um modelo de banco de dados baseado no conceito de orientação a objetos. Este modelo visav
a facilitar, para os desenvolvedores, a implementação da camada de
persistência da aplicação, pois eles já estavam familiarizados com o paradigma de orientação a o
bjetos, consequentemente, a produtividade certament
e aumentaria. Na prática, esse modelo de dados não foi utilizado em grandes aplicações, visto que elas tinham um volume de dados muito grande e esse modelo era ineficiente em termos de tempo de resposta, pois ao contrário dos bancos de dados relacionai
s, eles não tinham um modelo matemático que facilitasse as suas operações de persistências.
Então a solução foi usar os BDR e desenvolver ferramentas para que o seu uso seja facilitado. Uma dessas ferramentas é o framework Hibernate que usa o conceito d
e mapeamento objeto relacional (MOR).
As subseções seguintes apresentam os conceitos relacionados ao mapeamento objeto relacional.

2.1 Mapeamento objeto relacional
Como foi descrito anteriormente, mapeamento objeto relacional funciona com a transformação dos dados de um objeto em uma linha de uma tabela de um banco de dados, ou de forma inversa, com a transformação de uma linha da tabela em um objeto da aplicação. Abordando essa idéia, alguns problemas poderão existir, como, se um obje
to tiver uma coleção de outros objetos. Nas próximas
subseções serão abordados os alguns
tipos de mapeamentos básicos.
2.1.1 Mapeamento de um objeto com tipos primitivos
Esse é o mapeamento mais simples, o
nde um objeto tem apenas tipos de dados básicos. Vale salientar que entendesse por tipos básicos aqueles que possuem um correspondente em SQL, ou seja, o tipo String da linguagem Java é considerado um tipo básico, pois ele possui um correspondente em SQL.
Na Figura 1, observa-se o mapeamento de três objetos do tipo Veiculo na tabela de um banco de dados. Caso a aplicação deseje saber o veículo da cor vermelha, por exemplo, então o objeto que tem o Pálio como modelo é retornado.



2.1.2 Mapeamento de objetos que contém uma coleção de objetos
Esse tipo de mapeamento é quando um objeto possui um conjunto de outros objetos. Para obter esse conceito é necessário adicionar, ao exemplo da Figura 1, uma nova classe chamada de Fabricante que conterá as informações: nome, que armazenará o nome desse fabricante e o veiculos, que conterá o conjunto de veículos do fabricante (telefone e endereco não são informações relevantes no exemplo). Faz-se necessário a adição de uma informação na classe Veiculo chamada de fabricante, como mostrado na Figura 2.
O atributo fabricante adicionado em Veiculo é simplesmente para relacionar um veículo ao seu fabricante, enquanto o veiculos de Fabricante referencia a classe Veiculo.
Como foram realizadas mudanças no domínio do exemplo orientado a objetos, faz-se necessária uma alteração no modelo do banco de dados. Primeiramente, o vínculo que foi realizado entre um fabricante e um veículo deverá ser implementado através de uma chave estrangeira (referência a uma outra tabela, pois em BDR não existe o conceito de coleções) que se localizará na tabela VEICULO, caracterizando o mapeamento 1 para N, ou seja, um veículo possui apenas um fabricante e um fabricante possui vários (N) veículos. Essa chave estrangeira será realizada entre a informação nome da classe Fabricante e o atributo fabricante da classe Veiculo.

Para um melhor entendimento, a Figura 3 mostra o mapeamento dos objetos para as tabelas no BDR. Nele observa-se que cada veículo está associado com um fabricante, isso implica dizer que na tabela de VEICULO existe uma referência para a tabela FABRICANTE. Essa associação é feita através da coluna fabricante da tabela VEICULO. Pensando em termos práticos, quando um veículo for inserido no banco de dados, ele será ligado ao seu respectivo fabricante, no momento da inserção.
Para recuperar os veículos inseridos o desenvolvedor terá que implementar uma busca que retorne além das informações do veículo as informações do seu fabricante, isso poderá ser realizado fazendo a seguinte consulta SQL: SELECT * FROM fabricante WHERE nome = , onde é o nome do fabricante que está na tabela VEICULO, por exemplo, caso a aplicação deseje as informações do veículo do modelo Pálio, então para se buscar o fabricante a seguinte consulta será realizada: SELECT * FROM fabricante WHERE nome = 'Fiat'.
Utilizando a mesma idéia, os fabricantes são buscados; a única diferença é que agora a consulta que buscará os veículos associados com o fabricante retornará uma coleção de veículos (SELECT * FROM veiculo WHERE fabricante = ).
Esse tipo de mapeamento é muito utilizado em aplicações em que os objetos fazem muita referência a outros objetos.

Fonte:
Hibernate com Anotações. Por: Raphaela Galhardo Fernandes e Gleydson de A. Ferreira Lima

Controle de Transações

A noção de transação é introduzida para forçar o sistema a executar uma seqüência de ações elementares como se fosse uma unidade lógica, sem interferência externa.

Uma unidade lógica de trabalho deve mostrar quatro propriedades, designadas pelas iniciais ACID (atomicidade, consistência, isolamento e durabilidade), para que seja qualificada como uma transação.

Atomicidade
Uma transação deve ser uma unidade atômica de trabalho; ou todas as suas modificações de dados são executadas ou nenhuma delas é executada. O ponto essencial da transação é englobar vários passos em uma única operação de tudo ou nada.
Consistência
Quando concluída, uma transação deve deixar todos os dados em um estado consistente. Em um banco de dados relacional, todas as regras devem ser aplicadas às modificações da transação para manter toda a integridade dos dados. Todas as estruturas de dados internas, tais como índices em árvore B ou listas duplamente vinculadas, devem estar corretas ao término da transação.
Isolamento
Modificações feitas por transações simultâneas devem ser isoladas uma das outras. Uma transação ’A’ ou reconhece os dados no estado em que estavam antes de outra transação ‘B’ simultânea tê-los modificado ou reconhece os dados depois que a segunda transação tiver sido concluída, mas não reconhece um estado intermediário. Isso é chamado serializabilidade porque resulta na capacidade de recarregar os dados iniciais e reexecutar uma série de transações de modo que os dados obtidos estejam no mesmo estado em que estavam depois que as transações originais foram executadas.
Durabilidade
Depois que uma transação tiver sido concluída, seus efeitos ficam permanentemente no sistema. As modificações persistem até mesmo no caso de uma queda do sistema.

.

A transação envolve os comandos sql BEGIN, COMMIT e ROLLBACK

BEGIN
O comando BEGIN inicia um bloco de transação, ou seja, todos os comandos após o BEGIN são executados em uma única transação, até ser encontrado um COMMIT ou ROLLBACK explícito.

COMMIT
O comando COMMIT efetiva a transação corrente. Todas as modificações efetuadas pela transação se tornam visíveis para os outros.

ROLLBACK
O comando ROLLBACK desfaz a transação corrente, fazendo com que todas as modificações realizadas por esta transação sejam rejeitadas.



Boas práticas para o controle de transações

1. Mantenha a transação tão curta quanto possível.
Depois de saber quais são as modificações que precisam ser feitas, inicie uma transação, execute as instruções de modificação e, em seguida, confirme ou reverta imediatamente. Só abra a transação quando for necessário.
2. Não abra uma transação enquanto estiver navegando pelos dados, se possível.
As transações não devem ser iniciadas até que toda a análise preliminar de dados tenha terminado.
3. Não solicite entradas de usuários durante a transação.
Obtenha todas as entradas necessárias da parte dos usuários antes do início de uma transação. Sendo necessária uma entrada adicional de usuário durante uma transação, reverta a transação atual e reinicie a transação depois que a entrada do usuário for fornecida. Todos os recursos mantidos pela transação são retidos por um tempo ate que o usuario responda, criando potencial para causar problemas de bloqueio.
4. Acesse a menor quantidade de dados possível enquanto estiver em uma transação.
Isso reduz o número de linhas bloqueadas, reduzindo, portanto, a contenção entre transações.



Fontes
http://msdn.microsoft.com/pt-br/library/ms175127.aspx
http://www.devmedia.com.br/post-10089-Conceitos-Transacoes-e-Log-Transaction.html
http://www.slideshare.net/ViniciusPaluch/transacoes-em-banco-de-dados-pt1