Você está na página 1de 12

Desenvolvimento, Segurana e Qualidade na Internet Objetos Distribudos e Componentes Prof. Dr.

Cludio Fernando Resin Geyer

Altevir da Glria Pereira Jos Ricardo Bianco Ronaldo Gonalves de Moura

Dezembro/2003

Introduo Apesar de o mercado estar cada vez mais adotando modelos de desenvolvimento orientado a objetos como padro, a utilizao de bancos de dados relacionais ainda uma prtica comum que deve ser mantida por muito tempo, visto que aps anos de desenvolvimento e ajustes de performance os bancos de dados relacionais so mais eficientes, se comparados maioria dos Sistemas Gerenciadores de Banco de Dados (SGBD) orientados a objetos. Trabalhar com dados relacionais implica em adaptaes dos modelos de objetos, aumentando o esforo aplicado no processo de persistncia manual dos objetos no banco de dados e obrigando os desenvolvedores de aplicaes a utilizar a linguagem SQL para acessos aos dados. Isto significa uma reduo considervel na qualidade do produto final, a construo de uma modelagem orientada a objetos inconsistente e um desperdcio considervel de tempo na implementao manual da persistncia. Uma soluo adotada por muitos desenvolvedores na implementao da persistncia de objetos se d atravs da incluso de instrues SQL na codificao da lgica da aplicao. Tal fato, muitas vezes implica no acoplamento do sistema ao SGBD utilizado. Assim, alteraes na estrutura das tabelas ou do prprio banco de dados implicam em alteraes nas instrues SQL, devendo, portanto, a aplicao ser reescrita, recompilada e testada novamente. Uma outra soluo adotada permite diminuir este acoplamento. A idia retirar as instrues SQL das classes da aplicao e inclu-las em classes especializadas, denominadas Classes de Acesso a Dados (Data Access Classes). Deste modo, as alteraes no modelo de dados vo requer modificaes apenas nas classes de acesso a dados, o que restringe o impacto das mudanas no sistema como um todo. O cdigo fica mais limpo e mais fcil de manter, mais ainda no a soluo ideal visto que os dois mundos (objetos e dados relacionais) ainda esto presentes e intimamente ligados. Uma camada de abstrao de acesso a dados deve garantir aos desenvolvedores de software independncia entre o modelo de objetos e o esquema do banco de dados, permitindo, ainda, o armazenamento dos dados em mecanismos de persistncia diferentes dos relacionais, tais como SGBD orientados a objetos, objeto-relacionais ou arquivos XML. A fim de contornar estes problemas, foram propostas diversas idias para permitir um processo de mapeamento entre sistemas baseados em objetos e bases de dados relacionais. Tais propostas convergiram para o conceito de Camadas de Persistncia.

Camadas de Persistncia Por definio, uma camada de persistncia de objetos um conjunto de programas (uma biblioteca) que permite, de forma transparente, a realizao do processo de persistncia, ou seja, o armazenamento e manuteno do estado de objetos em algum meio no voltil. A independncia entre a camada de persistncia e o repositrio utilizado permite o gerenciamento da persistncia de um modelo de objetos em diversos tipos de repositrios. A camada de persistncia d ao desenvolvedor a capacidade de trabalhar como se estivesse em um sistema puramente orientado a objetos, utilizando-se de mtodos para incluir, alterar ou remover objetos a partir de uma linguagem de consulta para SGBD orientados a objetos, tal como a linguagem OQL. A utilizao de uma camada de persistncia encapsula, ou seja, isola os acessos realizados diretamente ao banco de dados pela aplicao. Deste modo, as construes de consultas e operaes de manipulao de dados (insert, update e delete) residem em uma camada de objetos inacessvel ao programador. O encapsulamento garante maior confiabilidade s aplicaes e permite que o prprio SGBD ou a estrutura de suas tabelas possam ser modificados sem grandes impactos aplicao. Alm do encapsulamento e do suporte aos diversos tipos de mecanismos de persistncia (SGDB relacional, arquivos XML, etc) citados acima, uma camada de persistncia deve implementar as seguintes caractersticas:

Possibilidade de manipulao de conjuntos de objetos, listas de objetos que so obtidas ou retornadas da base de dados. Implementar controle de transaes. Permitir a adio de novas classes ao esquema e uma fcil modificao do mecanismo de persistncia. Implementar algoritmos de gerao de chaves de identificao de modo a garantir que aplicao trabalhe com objetos com identidade nica. Implementar sincronizao entre o banco de dados e a aplicao. Implementar tcnicas (cursores, proxies, etc.) que garantam que os atributos somente sero carregados quando necessrios e que mantenham controle quanto posio dos objetos no banco de dados. Estas caractersticas so importantes para aplicaes que utilizam objetos grandes. Dar suporte a mecanismos de gerao de relatrios. Implementar pool de conexes que garanta a utilizao simultnea do sistema por vrios usurios sem queda de performance. Implementar um controle de acessos concorrentes.

Uma camada de persistncia deve estabelecer a estratgia atravs da qual os objetos sero persistidos em um banco de dados relacional, ou seja, como os objetos sero mapeados. Existem diversas tcnicas que possibilitam a implementao desse mapeamento de conjuntos de objetos, cada qual com suas vantagens e desvantagens. De maneira geral, cada camada de persistncia implementa uma destas tcnicas, de modo que o desenvolvedor de software, ao selecionar o mecanismo de persistncia com o qual trabalhar, dever organizar as tabelas em seu banco de dados de modo a suportar o esquema de objetos desejado. Uma das tcnicas utilizadas o mapeamento

por atributos que consiste em mapear os atributos de um objeto em colunas de uma tabela, levando-se em considerao o tipo e o comprimento mximo dos campos. importante salientar que alguns SGBD podem no suportar tipos binrios longos e que, muitas vezes, atributos de um objeto no devem ser obrigatoriamente referenciados por uma coluna da tabela. Suponha que um objeto que represente um pedido de compra possua um atributo valor total. til manter este atributo no objeto para fins de consulta, mas no ser interessante mape-lo no banco de dados, visto ser um dado que pode ser obtido atravs de clculo e sua manuteno no banco de dados seria redundante. Por outro lado, existem situaes nas quais um atributo deve ser mapeado para diversas colunas. Dependendo de como o sistema fora projetado, este o caso de atributos como endereo e telefone. Alm do Hibernate (que ser tratado mais adiante) outras implementaes de camadas de persistncia na linguagem Java esto disponveis gratuitamente na Internet. Dentre elas destacam-se o Castor, o Object-Relational Java Bridge (OJB) e o Torque. O Castor utiliza-se da API JDO (que prov integrao com ambientes J2EE.) para a persistncia em bancos de dados relacionais. O Castor suporta diversos SGBD tais como Oracle, Sybase, SQL Server, DB2, Informix, PostgreSQL, Hypersonic SQL, InstantDB, Interbase e MySQL. J o OJB um projeto do grupo Apache que fornece uma implementao opensource dos padres de mapeamento de objetos ODMG e JDO. Esta biblioteca d suporte a cenrios cliente-servidor (aplicaes distribudas) ou standalone, de forma que possvel utilizar a API OJB para persistncia de objetos mesmo em ambientes J2EE. Dentre os SGBD suportados pelo OJB destacam-se o DB2, Hypersonic SQL, Informix, MS-Access, MS-SQL Server, MySQL, Oracle, PostgreSQL e Sybase. Por ltimo, o Torque que um framework de persistncia desenvolvido como subprojeto do projeto Apache Turbine. Esta API trabalha gerando toda a estrutura de banco de dados, classes e cdigo SQL para acesso aos dados relativos a um esquema pr-configurado. O esquema escrito na forma de um arquivo XML, que interpretado pela biblioteca utilizando o Ant, uma ferramenta de compilao de cdigo do projeto Apache.

Hibernate

Hibernate um mecanismo simples e poderoso que permite a persistncia de objetos em banco de dados relacionais de maneira transparente para qualquer tipo de aplicao Java. Esta ferramenta, que pode ser baixada gratuitamente da Internet atravs do endereo http://hibernate.sf.net, possibilita que os objetos possam ser gravados e recuperados a partir de um banco de dados sem que o desenvolvedor tenha que se preocupar com muitos detalhes. No h necessidade de se implementar mapeamentos hard-coded no cdigo Java. O Hibernate resolve problemas como pool de conexes e configuraes de Datasources. Em linhas gerais, a codificao de um sistema pode ser dividida em duas partes: regras de negcio e servios de infra-estrutura. Regras de negcio, como o prprio nome diz, esto relacionadas ao negcio com o qual o sistema visa trabalhar. J os servios de infra-estrutura esto relacionados segurana, cache, transao, servios de nomes, etc. A idia do Hibernate permitir que o desenvolvedor mantenha seu foco sobre as regras de negcio, liberando-o de parte das tarefas de infra-estrutura.

O Hibernate suporta alguns dos principais bancos de dados relacionais disponveis no mercado, permitindo a utilizao de meios nativos para gerao de chaves primrias e pessimistic locking. O hibernate trabalha com os bancos de dados atravs de dialetos, conforme a tabela 1.

Tabela 1 Bancos de dados suportados pelo Hibernate

Banco de dados DB2 MySQL SAPDB Oracle Sybase Progress McKoiSQL Interbase/Firebird Pointbase PostgreSQL HypersonicSQL Microsoft SQL Server
Fonte: www.mundojava.com.br

Dialeto cirus.hibernate.sql.DB2Dialect cirus.hibernate.sql.MySqlDialect cirus.hibernate.sql.SAPDBDialect cirus.hibernate.sql.OracleDialect cirus.hibernate.sql.SybaseDialect cirus.hibernate.sql.ProgressDialect cirus.hibernate.sql.McKoiDialect cirus.hibernate.sql.InterbaseDialect cirus.hibernate.sql.PointbaseDialect cirus.hibernate.sql.PostgreSQLDialect cirus.hibernate.sql.HSQLDialect cirus.hibernate.sql.SybaseDialect

O desenvolvimento usando Hibernate um processo que pode ser dividido em cinco etapas. O primeiro passo a construo do banco de dados com o qual a aplicao ir trabalhar, ou seja, criar as tabelas onde os objetos sero persistidos. Este banco de dados, com suas entidades, atributos e relacionamentos, poder ser criado de forma tradicional ou, a critrio do usurio, poder ser utilizada a ferramenta SchemaExport que acompanha o Hibernate, Esta ferramenta gera o esquema do banco de dados baseado no relacionamento entre os objetos que se quer persistir. O segundo passo criao dos objetos cujos estados vo ser persistidos, isto , a construo de classes (beans) para cada entidade do banco de dados. Estas classes devem ser construdas seguindo o modelo JavaBeans, com mtodos get e set para manipulao dos atributos. Neste ponto, o Hibernate difere-se de outros mecanismos de persistncias como o JDO, visto que os beans utilizados pelo Hibernate no necessitam estender superclasses ou implementar interfaces. necessria a implementao de um construtor default (construtor sem parmetros) para todas as classes persistentes. O Hibernate faz a instanciao de objetos e o acesso s suas propriedades atravs de reflexo, assim mtodos de acesso e construtores no necessitam ser declarados como pblicos. Adicionalmente, deve ser criada uma propriedade chave-primria, que far s vezes de uma primary key, atravs da qual um objeto ser unicamente identificado. Esta propriedade, no obrigatria, pode ser do tipo primitivo int, long, char ou mesmo uma String.

Aps a criao das tabelas e dos beans necessrio criar meta-dados de modo a fornecer ao Hibernate informaes sobre como relacionar os objetos com as entidades do banco de dados. Esta a terceira etapa, a criao de arquivos XML que relacionam as propriedades de cada objeto aos campos das tabelas. Nestes arquivos de mapeamento deve-se informar, ainda, qual propriedade do objeto se relaciona com a chave-primria, bem com os relacionamentos entre entidades (inclusive os tipos de relacionamento: 1-1, 1-N ou N-N). A quarta etapa refere-se criao de um arquivo contendo as propriedades necessrias para que o Hibernate se conecte ao banco de dados. Existe um arquivo de configurao modelo (hibernate.properties) que poder ser utilizado como base para que o usurio proceda configurao. A quinta e ltima etapa a criao de Data Access Objects (DAO), Tais mecanismos so design pattern teis para separao da lgica de acesso a dados da lgica de negcios da aplicao. Estas classes que contero os mtodos de incluso, alterao, excluso dos objetos, etc. Em resumo, o Hibernate uma ferramenta que permite trabalhar com persistncia sobre banco de dados, sem necessidade da incluso de instrues SQL em meio ao cdigo Java, assim como elimina a necessidade de se mapear ResultSets e implementar configurao de pool de conexes, etc., o que torna o cdigo mais legvel e, conseqentemente, mais fcil de manter. Contudo a implementao no independente da fonte de dados, visto que o Hibernate trabalha apenas com alguns dos bancos de dados relacionais. Por outro lado, caso a aplicao exija consultas SQL complexas, h de se considerar a utilizao da linguagem HQL, a Query Language do Hibernate.

Principais caractersticas: Sua implementao relativamente simples Alta performance Definio de mapeamento Objeto/Relacional (XML e Xdoclet) Permite a persistncia dos objetos Java, incluindo polimorfismo, herana, composio, associao, etc, com grande facilidade. Possui uma linguagem de conexo (Hibernate Query Language) entre os mundos dos Objetos e Banco de dados relacionais simples Suporta apenas banco de dados relacionais (vide tabela 1). um software livre

Entity Beans O Java 2 Enterprise Edition (J2EE) uma arquitetura baseada em componentes, cujo modelo de componentes distribudo o Enterprise JavaBean (EJB). Pode-se dizer que EJB um componente do lado do servidor que encapsula a lgica de negcios de uma aplicao. Assim como o Hibernate, a idia aqui focar o desenvolvedor nas regras de negcio deixando a infra-estrutura por conta do EJB. aplicvel principalmente em aplicaes cuja robustez e escalonamento sejam aspectos importantes. Depende de outras tecnologias Java para funcionar corretamente, tais como Remote Method Invocation (RMI) e Java Naming and Directory Interface (JNDI). Cabe ressaltar que os EJBs somente sero distribudos quando executados sob um EJB container. Tal container fornece servios de infra-estrutura como transaes, segurana, pool de conexo com banco de dados, dentre outros. So trs os tipos de EJB: session beans, entity beans e message-driven beans. Um session bean (bean de sesso) representa um nico cliente em um servidor. Atravs dele, o usurio acessa uma aplicao no servidor, sem se preocupar com a complexidade das tarefas que esto sendo executadas. Podem conter informaes de estado (tipo statefull) ou no (tipo stateless). Um entity bean representa um objeto de entidade de negcios em um mecanismo de armazenamento persistente. Para o caso de este mecanismo ser um banco de dados relacional, pode-se dizer que cada entity bean possui correspondncia com uma das tabelas do banco de dados, sendo cada uma das instncias do entity bean correspondente a um registro da tabela. Beans de sesso e beans de entidade permitem o envio e o recebimento de mensagens Java Message Service (JMS) de forma sncrona. Os beans orientados a mensagens permitem aplicaes J2EE enviar e receber mensagens assncronas, atuando como um listener de mensagens JMS. Os beans de entidade so persistentes, permitem acesso compartilhado, possuem chaves primrias, podem participar de relacionamentos com outros beans de entidade, funcionando dentro de um esquema de transaes gerenciadas pelo EJB container. Para construir uma aplicao EJB, o desenvolvedor dever escrever um bean, escrever o descritor de distribuio (XML), criar um arquivo de distribuio (um arquivo .jar), distribuir o bean e escrever um aplicativo cliente para utilizar o bean. Tambm necessrio um servidor de aplicao EJB, como o JBoss. Como qualquer EJB, um entity bean possui um interface Home ou LocalHome e uma interface Remote ou Local. Existem duas alternativas para a persistncia de um entity bean: Bean Managed Persistence (BMP) ou Container Managed Persistence (CMP). No primeiro caso, o bean deve usar uma API (JBDC, SQLJ) para fazer chamadas de update, insert, select, etc. Desse modo, a persistncia feita pelo prprio componente, sendo o desenvolvedor o responsvel pela incluso de cdigos relativos a persistncia (persistncia explcita). No segundo caso, o prprio container faz um mapeamento dos objetos a entidades de um banco de dados, sendo que os mtodos do ciclo de vida so gerados automaticamente pelo container. Neste caso, o desenvolvedor apenas fornece um mapeamento relacionando o componente com o mecanismo de persistncia para que este possa criar comandos de incluso, excluso, consultas e atualizao. Enterprise JavaBean Query Language (EJB-QL) uma linguagem de pesquisa para componentes EJB, derivada da OQL, que tem por vantagem ser orientada a componentes e no ao mecanismo de banco de dados que esta persistindo os dados. Ainda uma

linguagem limitada, fato que fora, algumas vezes, o desenvolvedor a optar por uma soluo alternativa, como incluir cdigo SQL em beans de sesso, ou criar um mecanismo de pesquisa proprietrio para executar pesquisas mais complexas. Principais caractersticas: Requer muitos acessos ao banco de dados No orientado a objetos A linguagem EJB-QL limitada A sua implementao complexa

Comparao Hibernate e Entity Beans Criar uma entity bean padro requer a criao de uma nova classe Java, uma interface para ser usada pelos clientes e uma interface home para acessar os mtodos de consulta e mtodos de criao, e, opcionalmente, mais duas interfaces (se desejar ter interfaces locais e remotas) alm de ter que adicionar uma entrada JNDI e mapear os arquivos de configurao do JBoss. Existem muitas verificaes de consistncia que devero ser realizadas (freqentemente pelo programador devido s poucas opes de validao fornecidas pelos containers EJB) - por exemplo os parmetros na interface home para o mtodo create devem corresponder perfeitamente com os parmetros do mtodo do ejbCreate da implementao bean que por sua vez devem combinar com o mtodo do ejbPostCreate. Poucas destas verificaes de consistncia podem ser realizadas em tempo de compilao devem ser confirmadas pelo prprio container. Uma vez criado deve-se criar a estrutura da base de dados para o bean novo. Com o Hibernate, criada uma nica classe Java que um JavaBeans padro. criado um arquivo de mapeamento das propriedades do JavaBeans transformando-as em colunas de um banco de dados. O Hibernate inclui ferramentas para criar um arquivo JavaBean a partir de um arquivo de mapeamento das propriedades ou um arquivo de mapeamento a partir de uma classe JavaBean. Alm disso o Hibernate vem com o programa SchemaExport que l o banco de dados com o mapeamento e automaticamente cria a estrutura da base de dados (inclusive as colunas necessrias para o mapeamento dos relacionamentos). A definio de relacionamentos entre objetos seja em JBoss ou em Hibernate feita atravs de arquivos de configurao, entretanto, o mtodo utilizado pelo Hibernate parece ser mais simples no obstante ser, pelo menos, to poderoso quanto o JBoss.

Comparaes do Hibernate com outros frameworks de persistncia


Abra Castor JDO

Cayenne Y

Commons SQL Y

Hiber -nate Y Y

Jakarta OJB Y

OFBiz EE N N N N Y

Jakarta Torque N Y Y N

TJDO Y

Top-down Bottom-up Middle-out Meet-in-middle Generic-object JDO API ODMG3 API License

Y Y

Y Y

N BSD

N subset BSD

N N BSD

N N APL

N Y LGPL

soon Y APL

N N BSD

N N APL

Y APL

Consideraes finais

O uso de camadas de persistncia possibilita reduo considervel do tempo de implementao de um sistema. Agregam valor qualidade do produto final, mitigam a possibilidade de erros de codificao, bem como tornam o cdigo mais limpo e fcil de manter. O fraco acoplamento entre mecanismos de persistncia e lgica do sistema um aspecto importante que refora a sua utilidade. Fornecem um acesso mais natural aos dados, implementando vrios servios de infra-estrutura. Neste contexto, o Hibernate surgiu como um mecanismo simples e poderoso que permite a persistncia de objetos em banco de dados relacionais de maneira transparente para qualquer tipo de aplicao Java.

Referncias
http://www.ambysoft.com/ http://odmg.org http://hibernate.sourceforge.net http://www.exolab.org http://jakarta.apache.org/ojb http://jakarta.apache.org/turbine/torque/index.html http://jakarta.apache.org/ant/index.html http://mundojava.com.br