Uma Introdução Ao Java Persistence For Client-Side Developers
Uma Introdução Ao Java Persistence For Client-Side Developers
Uma Introdução Ao Java Persistence For Client-Side Developers
Client-Side Developers
• Conteúdo
• Quais são Persistência Java EE, Hibernate, e Hypersonic?
• Construção de seu primeiro objeto Persistable
• Criação de seu projeto
• Configuração do banco de dados
• Execução de uma consulta
• Iniciando o banco de dados dentro de sua aplicação
• Conclusão
• Recursos
A maioria das aplicações envolvem a criação, armazenamento e pesquisa de dados de alguma
forma, em outras palavras: use um banco de dados. Isso é muitas vezes chamado de CRUD, para
Create, Read, Update e Delete. Bancos de dados são partes integrantes de quase todos os sistemas
de computação. Bem, eu tenho uma confissão a fazer: eu tenho um engenheiro de software
profissional para perto de 10 anos agora e eu não sei nada sobre bancos de dados. Claro, eu posso
escrever um simples SELECT chamada, mas se você me pedir para fazer um duplo externo juntar
com chaves estrangeiras ou converter o meu esquema para forma normal 18, eu vou simplesmente
se perder e desistir. Eu não sei bases de dados. Na verdade, eu odeio bancos de dados. Eu sou um
cara do cliente. Para mim, um banco de dados é simplesmente uma caixa para armazenar o material.
Eu não sei como eles funcionam e eu não quero saber. No entanto, a triste realidade de software
cliente de hoje é que, como toda aplicação fica maior, ela eventualmente precisa de um banco de
dados. Do maior sistema de faturamento para algo tão simples como um livro de endereços, quase
todas as aplicações precisa de um banco de dados. Mas isso não muda o fato de que eu ainda odeio.
Então o que estamos desenvolvedores cliente para fazer? Aqui vai uma idéia: por que não roubar
alguns dos melhores tecnologias os caras servidor 'para tornar nossa vida mais fácil?
Com base nos novos recursos do Java SE 5 (aka Tiger), o Java Enterprise Edition Enterprise Java
Beans 3 spec (doravante conhecido pela abençoadamente mais curto "EJB3") introduziu uma nova
forma de comunicação com bancos de dados chamada Java Persistence API (JPA) . Embora
concebido essencialmente para o uso em grande, aplicações baseadas em servidor, vou mostrar
como usar JPA facilmente carregar, salvar e procurar objetos de dados em uma aplicação simples do
livro de endereços. Em um artigo de follow-up, vou cobrir mapeamento objeto avançado, herança e
busca. Mais importante, você será capaz de fazer todas as tarefas de banco de dados sem precisar
conhecer SQL, JDBC, ou qualquer outras tecnologias de banco de dados tradicional. Vamos ouvi-lo
para o lado do cliente!
@Entity
public class Person {
@Id @GeneratedValue
public Long id;
public String first;
public String middle;
public String last;
}
Como você pode ver, esta é uma classe muito simples. Ele tem três String campos para o
primeiro, nomes do meio, e por último, junto com um Long para o ID. Parece que qualquer objeto
Java normal. Na verdade, o termo mais freqüentemente usado com frameworks de persistência é
POJO, ou "Plain Old Java Object". As únicas coisas fora do comum para esse objeto são o
@Entity e @Id partes. Qualquer símbolo no início Java de código com @ é conhecida como uma
anotação. O uso de anotações é uma característica nova linguagem introduzida no Java SE 5.0 que
lhe permite adicionar metadados para seus objetos. Anotações marcar partes de seus objetos de
forma que outros sistemas podem fazer algo especial com eles. Neste artigo, vamos marcar certas
áreas e classes com anotações de persistência para que o framework de persistência saberá como
salvá-los.
No código acima, a Person classe é marcado com o @Entity anotação, o que significa que é
uma entidade EJB. Sendo marcado como uma entidade tem um monte de ramificações, mas para
nossos propósitos apenas significa que esse objeto pode ser mantida. Qualquer objeto que você
deseja coisas no banco de dados deve ser marcado com o @Entity anotação. O @Id anotação diz
que o id campo será usado como o identificador exclusivo para esse objeto. Bases de dados usar
uma coluna de tabela especial chamado uma chave primária para distinguir entre as linhas. O @Id
anotação marca o id campo como chave primária para este objeto. O @GeneratedValue
anotação informa o framework de persistência para gerar IDs para nós, o que é bom, porque nós não
nos importamos que eles são, enquanto eles são únicos. O @Id anotação tem muitos parâmetros
opcionais que permitem especificar melhor como funciona o seu chave primária, como selecionar
um nome de coluna particular ou usando vários campos. Para as nossas necessidades, o
comportamento padrão é ótimo.
Você pode notar que os outros campos - first , middle , e last - não tenho quaisquer
anotações. Isso é porque eles estão usando as anotações padrão que dizem que o campo é
persistente como um SQL VARCHAR . Como você explorar o framework de persistência Java você
vai descobrir o JSR especialista grupo fez um trabalho muito bom de definir padrões. Isto significa
que você só precisa usar valores não padrão quando você quiser fazer algo fora do comum. Esta
escolha design, parte da revisão em Java EE 5, faz a persistência muito fácil de usar para não-
servidor de desenvolvedores.
Para usar persistência, você deve primeiro criar um EntityManagerFactory usando o static
Persistence.createEntityManagerFactory() método. Observe a seqüência de
"sample" passado para o método. Esta é a unidade de persistência você estará usando, o que
deve coincidir com a configuração no arquivo persistence.xml que vamos chegar à tarde. Depois de
ter uma fábrica, você pode obter um EntityManager com o createEntityManager()
método. Em geral, você deve ter uma fábrica por aplicação e um gerente por usuário, geralmente
entregue e gerenciado por seu container de aplicação. Isso ocorre porque a fábrica é thread-safe e do
gerente não é. No entanto, essas restrições foram concebidos com aplicativos de servidor web em
mente. Para uma aplicação desktop, onde só há uma pessoa a usá-lo você pode simplesmente salvar
as referências e usá-los como você precisa. Basta lembrar que o EntityManager não é thread-
safe, isso não deixe de fazer tudo de sua persistência no mesmo segmento ou de uso múltiplo
EntityManager s.
Depois de ter terminado suas operações de persistência você pode desligar o gerente de fábrica e
com os respectivos métodos de perto.
private void shutdown() {
manager.close();
factory.close();
}
Acima, você pode ver o main() método que cria um Main objeto, inicializa o
sistema de persistência, faz algum trabalho, e então chama shutdown() em uma
finally bloco. Esta simples Main classe encapsula o ciclo de vida típico de um
aplicativo que usa a persistência.
Agora que o sistema de persistência é criado, nós podemos finalmente persistir alguns objetos! Você
só precisa criar uma transação, criar seus objetos, e depois salvá-los.
private void create() {
System.out.println("creating two people");
EntityTransaction tx = manager.getTransaction();
tx.begin();
try {
Person person = new Person();
person.first = "Joshua";
person.middle = "Michael";
person.last = "Marinacci";
manager.persist(person);
Transações são muito necessárias com persistência, porque você está conversando com um debaixo
do banco de dados. Normalmente você vai criar uma transação com
manager.getTransaction() , chame tx.begin() , e depois fazer tudo do seu trabalho. O
código acima chama manager.persist() para salvar os novos objetos, mas isso pode ser
facilmente chamadas para carregar, pesquisar ou atualizar objetos também. Uma vez terminado,
você deve chamar tx.commit() para fazer as alterações permanentes. Repare que as chamadas
são embrulhados em try / catch blocos. Isso é para que você possa reverter a transação, se
alguma coisa der errado, deixando seu banco de dados em um estado consistente.
<properties>
<property name="hibernate.connection.driver_class"
value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.connection.username"
value="sa"/>
<property name="hibernate.connection.password"
value=""/>
<property name="hibernate.connection.url"
value="jdbc:hsqldb:hsql://localhost"/>
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto"
value="update"/>
</properties>
</persistence-unit>
</persistence>
No arquivo acima, a primeira coisa que você deve observar é o name atributo do persistence-
unit elemento. Não importa o que este nome é, desde que ele corresponda a string passada para o
Persistence.createEntityManagerFactory() método. Mais uma vez, essa API foi
concebido para apoiar usos avançados, como lojas de persistência e bancos de dados. Uma vez que
este é incomum para aplicativos de desktop, eu recomendo usar apenas um nome e nunca alterá-lo.
O arquivo persistence.xml deve estar no diretório META-INF do seu jar da aplicação.. Se você
estiver usando o NetBeans, você pode colocá-lo em um diretório META-INF do seu diretório src e
deixe NetBeans copiá-lo para o lugar certo durante a compilação.
Finalmente estamos prontos para pôr em marcha acima o banco de dados e começar a salvar os
objetos. Hypersonic está contida em um frasco único., Hsqldb.jar, e você pode iniciá-lo com todas
as configurações padrão direito a partir da linha de comando.
java -classpath lib/hsqldb.jar org.hsqldb.Server
Isso irá iniciar uma instância do Hypersonic em sua porta padrão com o banco de dados armazenado
no teste .* arquivos colocados no diretório de trabalho atual. Usando os padrões é conveniente para
o teste porque você pode remover os dados por apenas apagar o teste criado .* arquivos quando
você está feito.
Se você compilar e executar o Main classe, e ter o banco de dados começou em outra janela, então
você deve ter um monte de saída do Hibernate seguido pelas duas linhas:
creating two people
created two people
Parabéns! Você acabou de persistiu seus objetos em primeiro lugar. Depois que você começa a
configuração inicial feito, você vai descobrir como é fácil para armazenar e recuperar seus objetos.
Você nunca mais vai precisar escrever SQL novamente.
Então, pouco antes de seu programa termina, você deve desligar Hypersonic SQL com um
SHUTDOWN comando como este:
// shutdown hypersonic
Statement stmt = c.createStatement();
stmt.execute("SHUTDOWN");
c.close();
} // end main() method
Além disso, desde que você já mudou a configuração do banco de dados, você precisa atualizar o
seu persistence.xml arquivo, especificamente alterando a propriedade URL de conexão
desse:
<property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/>
a esta:
Com essas poucas mudanças, o banco de dados será iniciado dentro de sua aplicação, salve todos os
dados para o test.* arquivos e desligar quando o aplicativo termina. Hypersonic é uma maneira
simples e compacto para armazenar todos os seus aplicativos em um banco de dados real, sem
nunca saber seus usuários.
Conclusão
A Java Persistence API foi concebido como uma maneira simples de carregar e salvar seus objetos
de dados sem usar qualquer SQL em tudo. Uma vez que também foi projetado para ser
independente de implementação, você pode alterar o seu banco de dados ou provedor de
persistência como suas necessidades mudam e não se preocupar com quebrar nada. Apesar de Java
Persistence foi originalmente concebido para tarefas de servidor, ele executa muito bem em
aplicativos cliente, permitindo que os desenvolvedores do lado do cliente gastar menos tempo de
armazenamento e mais tempo do que eles são bons em: assassino de construção de GUIs.
Junte-me em algumas semanas um artigo de acompanhamento em que explorar os recursos
avançados, como a persistência restrições, propriedades personalizadas, subclasses e gerenciamento
de objetos gráficos toda de uma vez.
Recursos
• Código fonte para este artigo
• O Java EE 5 Tutorial : ver Capítulo 25: "Introdução ao Java Persistence"
• O Java (EJB / JDO) Persistência FAQ
• Hibernate: Persistência Relacional para Java e NET.
• HSQLDB (Hypersonic)