quarta-feira, 11 de março de 2015

Exemplo de utilização do Java Persistence API - 2

Num artigo anterior criámos, no NetBeans, um projeto para acesso a uma BD ORACLE utilizando a Java Persistence API (JPA).
Entre esse e este artigo tivemos ainda tempo para resolver o problema da gestão de atribuição de chaves primárias no JPA sobre ORACLE.
Vamos, aqui, criar um projeto uma camada acima do anterior, que fornecerá para uma outra camada, de apresentação ou user interface, acima, um conjunto de serviços de lógica de negócio.
A camada de lógica de negócio aqui apresentada é apenas um exemplo possível. O objetivo é concentrar nesta camada os métodos que usam o JPA, de forma a libertar a camada acima (User Interface) desse conhecimento.

Começamos por criar um novo projeto de tipo Java Class Library, tal como anteriormente, e teremos que adicionar às suas Libraries, o projeto DAL feito no  artigo anterior.

Depois, criamos uma classe de apoio, BLLEntityManager.java, para nos fornecer o EntityManager (singleton), e iniciar alterações a objetos geridos (instâncias de JPA Entities já armazenadas na BD).

Gestão de atribuição de chaves primárias - ORACLE / JPA

No artigo anterior, usámos o JPA para criar uma camada de acesso a uma BD ORACLE.
A BD ORACLE, cuja criação foi tratada em "Exemplo de Aplicação Java Swing com BD Oracle - 1", usa sequências e triggers para atribuição automática da chave em cada tabela.

O JPA permite-nos fazer operações sobre a BD (criar, alterar, apagar ou selecionar registos das tabelas). No entanto, quando queremos fazer várias operações relacionadas, e precisamos de saber que chave foi atribuída pela BD a um dado registo criado anteriormente, cujo objeto ainda temos em memória, não temos maneira segura de conhecer o valor dessa chave. E, o objeto que ainda temos em memória permanece sem o valor da chave nos seus atributos, fazendo com que o JPA considere que essa instância não é gerida por si. Isto, impede-nos de usar essa instância para operações subsequentes com a BD.

O ORACLE, tipicamente usa sequências para atribuição de valores de chave primária nas suas tabelas.
A utilização dessas sequências na atribuição da chave primária pode fazer-se definindo um default value para a coluna respetiva, ou criando um trigger before insert o qual obtém o valor seguinte da sequência e o atribui à coluna da chave primária da tabela.

domingo, 8 de março de 2015

Exemplo de utilização do Java Persistence API - 1

Neste artigo vamos criar um projeto Java Class Library, usando o NetBeans, para acesso a uma BD ORACLE, usando o Java Persistence API (JPA).
Para criar a BD ORACLE pode seguir-se, por exemplo, este artigo.

No NetBeans, criamos um novo projeto de tipo "Java Class Library":


 Atribuimos um nome ao projeto:


O nosso novo projeto aparecerá como se segue, na janela de visualização de projetos do NetBeans:


Depois, queremos criar as classes Entidade a partir das tabelas já criadas na nossa base de dados ORACLE. Acedemos a New File --> Other e selecionamos, na categoria Persistence, o tipo de ficheiro "Entity Classes from Database":

segunda-feira, 9 de dezembro de 2013

Invocar serviços WCF via JSON endpoint numa página HTML - 3

No artigo anterior, vimos como fazer um pedido POST para invocar serviços de domínio WCF para operações de alteração, usando o endpoint JSON. Fizemos um exemplo com as páginas HTML e os serviços WCF no mesmo servidor Web (na verdade estavam mesmo no mesmo projeto do Visual Studio).

Vamos aqui tratar de conseguir fazer a mesma invocação, mas tendo a aplicação front-end (HTML) num servidor diferente do servidor dos serviços WCF. Isto implica uma invocação entre servidores (cross-server ou cross-origin).

Quando colocamos as páginas Web (callWCF.html  e  callWCF_Insert.html, nos artigos anteriores) num servidor diferente dos serviços WCF, passamos a obter os seguintes erros:

1 - Ao correr callWCF.html, que invoca o serviço ...svc/JSON/GetCars:




domingo, 8 de dezembro de 2013

Invocar serviços WCF via JSON endpoint numa página HTML - 2

Vimos, no artigo anterior, como fazer um pedido GET para invocar um serviço de domínio WCF para consulta de dados, usando o endpoint JSON.
Neste artigo, vamos ver como podemos invocar os serviços de domínio WCF para operações de alteração ou CRUD, usando o endpoint JSON. Veremos, nomeadamente, como podemos inserir um registo numa tabela, submetendo ao Domain Service WCF um conjunto de dados a alterar no domínio.

Para este exemplo foi particularmente útil a primeira referência da lista apresentada no final.

Este exemplo corre com as páginas HTML no mesmo servidor e porta que os serviços WCF. No próximo artigo veremos como fazer invocações cross domain, as quais trazem as suas próprias dores de cabeça.

A criação dos serviços WCF (Windows Communication Foundation) utilizados neste exemplo foi abordada nos artigos:

Neste exemplo vamos submeter ao Domain Service WCF, através de um pedido HTTP POST, um conjunto de alterações (change set) a efetuar no domínio de dados.
Tal como no exemplo anterior, iremos utilizar o JQuery para simplificar o nosso exemplo, e assume-se que o leitor já tem algum conhecimento de HTML e Javascript.


terça-feira, 3 de dezembro de 2013

Invocar serviços WCF via JSON endpoint numa página HTML - 1

Este artigo ilustra como invocar, numa página HTML, um serviço WCF (Windows Communication Foundation) disponibilizado através de um endpoint JSON, tal como criado anteriormente nos artigos:



Neste exemplo vamos "consumir" (invocar), através de um pedido HTTP GET, um serviço sem parâmetros de entrada e que devolve uma lista de instâncias no formato JSON. Iremos utilizar o JQuery para simplificar o nosso exemplo, e assume-se que o leitor já tem algum conhecimento de HTML e Javascript.

O JQuery é uma biblioteca de JavaScript, multi-browser, e que pretende facilitar o desenvolvimento de scripts do lado do cliente, em páginas HTML.
Para mais informação e introdução ao JQuery, consultar, por exemplo:


Vamos então escrever uma página HTML muito simples:


segunda-feira, 2 de dezembro de 2013

Disponibilizar Serviços WCF em JSON

Vimos, no artigo anterior, como expor os dados da nossa base de dados (BD) como coleções de instâncias através do protocolo OData, recorrendo a um projeto WCF Service Application e ao Entity Framework.

O OData baseia-se em protocolos standard para oferecer serviços de dados interoperáveis com aplicações que não usam a framework .Net. Como é baseado em URIs standard para aceder aos dados, podemos aceder e alterar dados usando a semantica REST (Representational State Transfer), como sejam os verbos GET, PUT, POST e DELETE. Isto possibilita a utilização destes serviços a partir de qualquer cliente que possa aceder a dados transmitidos sobre protocolo HTTP standard.

Um serviço OData pode representar dados no formato Atom, JSON (JavaScript Object Notation) e XML, sendo que Atom é o formato por omissão.
O formato dos dados é especificado no header do pedido HTTP.

É bastante fácil acrescentar serviços customizados a serviços de dados WCF, através de Service Operations.
Service Operations são métodos disponibilizados num servidor e que podem ser acedidos por URIs da mesma forma que os recursos de dados vistos anteriormente.
Service Operations podem também usar expressões de query para filtrar, ordenar e paginar os dados resultado da invocação de uma operação.

Vamos, neste artigo, ver como podemos disponibilizar Service Operations, em formato OData, SOAP e JSON.