Hibernate e JPA por que?

Olá pessoal!

As vezes me peguntam por que não utiliza um framework de persistência como Hibernete ou JPA?
Bem, eu utilizo qualquer framework que me manderem, se estiverem me pagando por isso.
Mas por questão de gosto pessoal, eu perfiro utilizar algo mais simples e menos dependente como
JDBC.
É claro que utilizar codigo SQL crú não é muito legal, mas para isso eu utilizo uma combinação de
Annotations e hoje impulsionarei isso com o processador de anotações e o JavaFileObject
Hoje é assim que tenho trabalhado com minhas querys:

	//Aliases aliases = new Aliases();
	//aliases.add(new TableAliases("a", Usuario.class))
	//aliases.add(new TableAliases("b", Pessoa.class))
	//declaro minha aliases e jogo elas aqui:
	context
		.SELECT(
			aliases.get("a").Field(Usuario.idUsuario),
			aliases.get("b").Field(Pessoa.nome)
		)
		.FROM("a")
			.INNER_JOIN("b")
				.ON(  	aliases.get("a").Field(Usuario.idPessoa)  .EQUAL( aliases.get("b").Field(Pessoa.idPessoa)  )
					.AND(
						aliases.get("b").Field(Pessoa.nome)  .equal( STRINGNAMEQUALQUER ) )
				.WHERE(
					aliases.get("b").Field(Pessoa.nome)  .equal( STRINGNAMEQUALQUER ) 
				);

Não tenho problemas com XML, refatoração ou mapeamento.
Qualquer inconsistencia de é mostrada no momento da compilação.
Se um campo não existir em uma tabela por exemplo, eu vejo na hora da compilação.

Alguem achou interessante?
Isso não teria demanda?

Bem, fica aqui respondido porque eu não utilizo Hibernate ou JPA.

[quote=Luiz Augusto Prado]Olá pessoal!

As vezes me peguntam por que não utiliza um framework de persistência como Hibernete ou JPA?
Bem, eu utilizo qualquer framework que me manderem, se estiverem me pagando por isso.
Mas por questão de gosto pessoal, eu perfiro utilizar algo mais simples e menos dependente como
JDBC.
É claro que utilizar codigo SQL crú não é muito legal, mas para isso eu utilizo uma combinação de
Annotations e hoje impulsionarei isso com o processador de anotações e o JavaFileObject
Hoje é assim que tenho trabalhado com minhas querys:

	//Aliases aliases = new Aliases();
	//aliases.add(new TableAliases("a", Usuario.class))
	//aliases.add(new TableAliases("b", Pessoa.class))
	//declaro minha aliases e jogo elas aqui:
	context
		.SELECT(
			aliases.get("a").Field(Usuario.idUsuario),
			aliases.get("b").Field(Pessoa.nome)
		)
		.FROM("a")
			.INNER_JOIN("b")
				.ON(  	aliases.get("a").Field(Usuario.idPessoa)  .EQUAL( aliases.get("b").Field(Pessoa.idPessoa)  )
					.AND(
						aliases.get("b").Field(Pessoa.nome)  .equal( STRINGNAMEQUALQUER ) )
				.WHERE(
					aliases.get("b").Field(Pessoa.nome)  .equal( STRINGNAMEQUALQUER ) 
				);

Não tenho problemas com XML, refatoração ou mapeamento.
Qualquer inconsistencia de é mostrada no momento da compilação.
Se um campo não existir em uma tabela por exemplo, eu vejo na hora da compilação.

Alguem achou interessante?
Isso não teria demanda?

Bem, fica aqui respondido porque eu não utilizo Hibernate ou JPA.

[/quote]

Isso tem demanda e muito! O Hibernate/JPA não é uma unanimidade, muito pelo contrário: há uma corrente grande que pregam um outro caminho, eu incluso.

Nada contra quem quer usar esses carinhas. Cada um na sua. Mas fica aí a nossa opinião.

Há o iBatis e diversos outros frameworks que te deixam mais próximo de SQL ao mesmo tempo que eliminam o trabalho repetitivo do JDBC.

Isso que vc sugeriu aí é bastante parecido com jOOQ.

Eu particularmente prefiro ficar o mais próximo possível de JDBC, usando StringBuilder mesmo, sem é claro ter que se preocupar com o mapeamento campo banco -> variável de instância. Por isso uso o MentaBean, que faz exatamente isso.

Recomendo vc dar uma lida aqui:


http://database-programmer.blogspot.com/2010/12/hi...al-perspective-of-orm-and.html
http://lukaseder.wordpress.com/2011/09/12/mentabea...he-ormsql-builder-of-mentawai/

[i]
"Minha bússula, que não necessariamente tem que ser usada por outros, me diz que COMPLEXIDADE é EVIL. Qualquer pessoa mediana pode fazer qualquer coisa funcionar bem em programacão. A diferenca é como se faz. Se um cara pega o meu sistema e não entende, ou ele é muito fraco ou eu é que sou. E na grande maioria das vezes será a última opcão. O que mais tem por aí são sistemas que só o autor entende, que poderia ter 5 objetos mas tem 50, que poderia ter usado 3 frameworks mas utilizou 30. Menos é mais! Foi o que o cara do pequeno principe falou. (“Em tudo na vida a perfeição é finalmente atingida, não quando nada mais existe para acrescentar, mas quando não há mais nada para retirar.”) "

“Eu só dou um passo para aprender uma coisa nova em tecnologia se eu vejo que o passo é na direcão da SIMPLICIDADE, do low-level para o high-level.”[/i]

Eu também vejo a complexidade como má se temos opções mais simples.
Sei que o Hibernate não é tão ruim, mas para algumas coisas acho que ele não funciona bem.
Como eu quero saber o que está acontecendo, sem depender do suporte que as vezes é demorado ou, como já me pediram, para esperar a proxima versão, penso que o tempo em fazer um programa simples que atenda as minhas necessidades seja praticamente o mesmo que esperar uma resposta ou mesmo uma proxima versão de framework. Ainda tenho a vantagem de saber o que é, pra que serve e onde está cada parte do código.

A questão que coloco aqui é se vale apena investir em um outro framework para comercializa-lo, pois caso contrario, eu continuarei trabalhando solitariamente com o que já tenho.
Da forma que estou desenvolvendo é possivel até permitir o hibernate no lugar do JDBC desde que ele devolva um ResultSet. Neste caso o hibernete seria apenas para a necessidade da comunicacao entre 2 ou mais bancos de dados.

Um artigo modesto de um casting customizado:
Using Hibernate to Support Custom Domain Object Fields

Outros que não são muito fans do hibernate
http://www.bb242.de/2008/05/07/i-hate-hibernate/

Sério pessoal, eu acho que o Marketing do Hibernete é mais forte do que realmente promete.
Não dá para utilizar Banco de dados sem saber SQL mesmo se for utilizar apenas Hibernate.

É difícil vender algo que se tem aos montes gratuitamente, a não ser que vc ofereça um diferencial bastante grande que justifique. Outra opção é oferecer gratuitamente e vender um pacote extra, para empresas, que inclui suporte. Nesse sentido acho que o que o pessoal do Vaadin está fazendo um bom trabalho.

[quote=saoj][quote]
A questão que coloco aqui é se vale apena investir em um outro framework para comercializa-lo
[/quote]

É difícil vender algo que se tem aos montes gratuitamente, a não ser que vc ofereça um diferencial bastante grande que justifique. Outra opção é oferecer gratuitamente e vender um pacote extra, para empresas, que inclui suporte. Nesse sentido acho que o que o pessoal do Vaadin está fazendo um bom trabalho.

[/quote]

Não conheço o Vaadin
Seria o mesmo referido aqui?

Mas pelo que eu li, é voltado para RIA e não persistencia de dados?
Procurei no tutorial deles como fazem a camada de persistencia e não encontrei.

Estava falando disso: https://vaadin.com/pro

Uma outra opção que pensei é a venda de CDs com os fontes e um PDF
mostrando como tudo funciona. Isso é mais interessante porque além do
meu econômico permitiria que outros melhorem o código, mas não me serviria para nada
se apenas 10 pessoas se interessarem. Seria muito trabalho pra pouco rendimento.

Proponho 3 diferênciais:

  1. O recurso de auto completar apresenta a função permitida para a
    sequencia de instruções.
    Por exemplo, se eu digitar “context.SELECT().” o recurso de autocompletar
    abrirá uma caixa de opçes mostrando os comandos possiveis. Nete
    caso para o select teriamos o “FROM(String aliase)”.
  2. As entidades são feitas nomarlamente mas são decoradas com annotations
    (prefiro annotations na mesma entidade ) para informar atributos como por exemplo
    o tipo de dado do bd, o comprimento, se é chave ou não e o tipo, se é uma
    chave extrangeira e de qual tabela e de que campo refere, se é nulo ou requerido…
  3. E o principal, na minha opinião, é não utilizar nenhuma string na construção de
    minha query, de forma que qualquer campo em uma tabela seja veriricado se
    realmente existe no momento da compilação. Tenho visto que a maioria dos
    frameworks para persistencia compilam querys com erros de SQL que só
    ser descobertas testando o programa já compilado.

Eu tambem prefiro o mais simples possivel !.
Exemplo: Estou utilizando [color=blue]xml no tomcat[/color] para conexao com o banco de dados.

Luiz Augusto Prado,
Se for possivel manda uns exemplos praticos para mim, por favor.
obg

Não faz sentido se o cara pode baixar pela Internet e comprar o PDF online.

Vc diz o recurso do Eclipse, certo? Ou vc quer fazer uma IDE?

Prefiro configuração programática => http://mentabean.soliveirajr.com/posts/list/21.page

Compilar SQL pode ser uma boa para pegar erros, mas tem que tomar cuidado para não criar uma nova linguagem objetizada em cima do SQL. Vide Criteria do Hibernate. Qualquer campo da tabela tem que ser abstraído, concordo. Mas apenas no select, no where/join eu prefiro usar os campos mesmo, para não poluir essas condições, deixando-as bem claras => http://mentabean.soliveirajr.com/posts/list/22.page

[/quote]

[quote=saoj][quote]
Uma outra opção que pensei é a venda de CDs com os fontes e um PDF
mostrando como tudo funciona.
[/quote]
Não faz sentido se o cara pode baixar pela Internet e comprar o PDF online.
[/quote]

Exatamente, a não ser que eu consiga uma 1000 pessoas interessadas em comprar os CDs de uma vez só.
Isso não sria fácil. Alguem iria comprar e repassar pra todo mundo.
A melhor forma seria mesmo comercializar o bin.

[quote=saoj][quote]

  1. O recurso de auto completar apresenta a função permitida para a
    sequencia de instruções.
    Por exemplo, se eu digitar "context.SELECT()." o recurso de autocompletar
    abrirá uma caixa de opçes mostrando os comandos possiveis. Nete
    caso para o select teriamos o "FROM(String aliase)".
    [/quote]
    Vc diz o recurso do Eclipse, certo? Ou vc quer fazer uma IDE?
    [/quote]

Não. Não é isso que eu falei. Eu quis dizer que com o recurso de autocompletar,
que qualquer IDE, é possivel ver os proximos passos da construção da query.
Isso faz parte da forma como o programa foi feito. Por exemplo, se eu iniciar um
"contex.SELECT(). ", o autocompletar não vai mostrar metodos como o "ON",
"AND", "OR". Ele irá mostrar apenas as funções possiveis de se ter apos um
select. Neste caso o "FROM".

[quote=saoj][quote]
2) As entidades são feitas nomarlamente mas são decoradas com annotations
(prefiro annotations na mesma entidade ) para informar atributos como por exemplo
o tipo de dado do bd, o comprimento, se é chave ou não e o tipo, se é uma
chave extrangeira e de qual tabela e de que campo refere, se é nulo ou requerido…
[/quote]
Prefiro configuração programática => http://mentabean.soliveirajr.com/posts/list/21.page
[/quote]

Entendo seu gosto. Para o caso da criação das entidades eu achei melhor utilizar
annotations porque assim o a codificação do relacionamento entre BD e Java
ficariam juntas em um código só. Só existem 4 tipos de anotações
As de Tabela;
As de campo;
As de chave extrangeira;
E as Transient (que já são proprias da serialização).

[quote=saoj][quote]
3) E o principal, na minha opinião, é não utilizar nenhuma string na construção de
minha query, de forma que qualquer campo em uma tabela seja veriricado se
realmente existe no momento da compilação. Tenho visto que a maioria dos
frameworks para persistencia compilam querys com erros de SQL que só
ser descobertas testando o programa já compilado.
[/quote]
Compilar SQL pode ser uma boa para pegar erros, mas tem que tomar cuidado para não criar uma nova linguagem objetizada em cima do SQL. Vide Criteria do Hibernate. Qualquer campo da tabela tem que ser abstraído, concordo. Mas apenas no select, no where/join eu prefiro usar os campos mesmo, para não poluir essas condições, deixando-as bem claras => http://mentabean.soliveirajr.com/posts/list/22.page
[/quote]

Sim! Isso!
Não pretendo fugir do SQL padrão.

Infelizmente, palavras SQL mudam um pouco de banco de dados para outro.
Por exemplo: palavra que indica auto incremento varia para alguns bando de dados.

A ideia é que para cada palavra que tenha variação, esta variação esteja
separada em uma classe aparte de forma que eu possa trabalhar com o SQL
genérico e apartir deste SQL generico buscar a referencia em outra classe, específica
para o banco de dados que estou utilizando.

O meu "context." é uma classe que é do tipo SQL.
Mas a classe SQL extende uma classe abstrata chamada MySQL, e é nesta
classe onde estão todas as variação proprias do MySQL. Eu poderia ter uma outra classe
chamada PostgreSQL para interagir com um banco de dados Postgre.

Vc vai acabar fazendo um novo hibernate. Cuidado com isso: http://lukaseder.wordpress.com/2011/09/07/why-did-hibernatejpa-get-so-complex/

Annotations são perigosas: http://lukaseder.wordpress.com/2011/09/13/annotatiomania-in-struts-2-0/

Isso parece muito parecido com que o jOOQ faz. Não estou falando que vc não deve fazer a sua própria versão, mas dá uma olhada lá para ver como isso é feito hoje: http://www.jooq.org/

As anotações que são inseridas são restritas ao desenvolvimento.
Por exemplo, se alguem pegasse meu condigo bunario e fizesse engenharia reversa só veria codificação para JDBC e
as atribuições do resultset para o objeto de serialização.
Provavelmente ele acharia graça do tempo que “levei” para escrever a montanha de código.
As únicas annotations que poderiam esta indo para o código seriam as do proprio codigo nativo do java.
Digo isso porque não conheço todo o código dele e por isso ão duvido que existam annotations lá. Mas quanto
ao compilador java. Eu confio.

Eu dei uma olhada e não achei tão parecido.

Se vc já trabalhou com hibernate, as unicas diferença seria que o número de anntations reduziria para 4
(no máximo 5 porque estou estudando mudar algumas coisas), a sintaxe da construção das queries
são como as do primeiro post.

Antes de implementar as alterações para comercialização e difusão tenho que fazer a pesquiza de campo
para ver se realmente existe demanda para algo novo tendo em vista que já existem
tantos frameworks gratuitos semelhantes além do Hibernate e do JPA.

Por enquanto estou apostando na predivulgação da forma como as queries são feitas.
O resto ainda é segredo.

O pessoal que tiver algum interesse poderá me enviar suas propostas e sugestões por e-mail.

Olá Lindberg,

Hoje eu consegui fazer um pequeno exemplo do que proponho.
Dentro do Zip existe um PDF explicando como funciona a biblioteca do ORM.

My Little JAVA ORM here:
http://www.codigorapido.com.br/testeOrm.zip

Ainda tem muito o que melhorar, mas acho que tá começando a ficar como eu quero.

[quote=wellington.nogueira]Hmm… dei uma olhada no teu exemplo, e acho que entendi o que você fez. Só achei que tudo ficou um pouco espalhado demais. Para sistemas pequenos é tranquilo e até para sistemas médios pode ser controlável, mas a medida que um sistema cresce, pode-se criar uma dificuldade bem indesejável.

No construtor das classes que herdam de Alias, tentaria fazer algo com reflection para evitar o mapeamento que seria obrigado a fazer ali (ou melhor, transferiria essa responsabilidade para o construtor do Alias).[/quote]

Eu mudei um pouco os metodos. Vi que existiam algumas redundancias e resolvi tirar.
Existem 2 formas de se utilizar o SQL:
pela criação de um novo Context - ideal para obter listas e campos específicos. Exemplo visto no metodo mostrar_todos
apartir de algum aliase - aqui trabalhamos com objetos das entidades. com um UsuarioAliase podemos realizar um CRUD em uma tabela Usuario.

Não existe Lazzy ou Eager, por enquanto.
Usuo o setAutoCommit nas transações.

package testeorm.business;


import testeorm.Implementeds.*;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; 
import orm.syntaxe.*;

/**
 * @author Luiz Augusto S. Prado (www.codigorapido.com.br - 2011)
 */
public class UsuarioBu
{
	Connection con;

	// minha conexao
	public UsuarioBu(Connection con)
	{
		this.con=con;
	}

	/**
	* <b>mostrar todos os usuarios</b> <br/><br/>
	*/
	public  List<Usuario>  mostrarTodos() throws Exception
	{
		//====================================================================================================
		//	1 - Criar os Aliases
		//====================================================================================================
		UsuarioAliase alias_Usuario = new UsuarioAliase("user") ;
		PessoaAliase   alias_Pessoa   = new   PessoaAliase("person") ;
		 
		//====================================================================================================
		//	2 - Criar as restries
		//====================================================================================================
		Restrictions on = new Restrictions()
				.Equal(alias_Usuario.idPessoa, alias_Pessoa.idPessoa) 
				.getRestrictions();
		// poderia inserir mais esta busca por exemplo
		// Restrictions where = new Restrictions()
		//		.Equal(a.login, "teste")
		//		.getRestrictions();

		//====================================================================================================
		//	3 - Construir Query
		//====================================================================================================
		Context contexto = new Context();

		String str = contexto
			.Select( alias_Usuario.idUsuario, alias_Pessoa.nome, alias_Pessoa.cpfcnpj )
			.From(alias_Usuario)
			.Join(Join.INNER, alias_Pessoa)
			.On(on)
			//.Where(where) // poderia inserir mais esta busca por exemplo
			.getQueryString();

		//System.out.println(str);

		//====================================================================================================
		//	4 - Executar query
		//====================================================================================================
 		PreparedStatement prepStmt = con.prepareStatement(str);
		ResultSet resultSet = prepStmt.executeQuery();

		//====================================================================================================
		//	5 -Popular Value Objects
		//====================================================================================================
		List<Usuario> usuarios = new ArrayList<Usuario>();
		while (resultSet.next())
		{
			Usuario usuario = alias_Usuario.populeObject( resultSet, alias_Usuario.idUsuario );
			Pessoa pessoa = alias_Pessoa.populeObject(resultSet, alias_Pessoa.nome, alias_Pessoa.cpfcnpj );
			usuario.setPessoa(pessoa);
			usuarios.add(usuario);
		}

		//====================================================================================================
		//	6 - fechar resultset e PreparedStatement
		//====================================================================================================
		resultSet.close();
		prepStmt.close();
		return usuarios; 
	}



	/**
	* <b>inserir usuario, e se não exisir, a pessoa relacionada a ele</b> <br/><br/>
	*/
	public  Usuario  inserir(Usuario usuario) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException,SQLException
	{
		//========================================================================================================
		// cria aliases de cada tabela
		//========================================================================================================
		UsuarioAliase alias_Usuario = new UsuarioAliase("user");
		PessoaAliase alias_Pessoa = new PessoaAliase("person");

		con.setAutoCommit(false);

		//====================================================================================================
		// Criar a restricao
		//====================================================================================================
		Restrictions where = new Restrictions()
				.Equal(alias_Pessoa.cpfcnpj, usuario.getPessoa().getCpfcnpj())
				.getRestrictions();

		//====================================================================================================
		// Construir Query
		//====================================================================================================
		Context contexto = new Context();

		String str = contexto
				.Select(alias_Pessoa)
				.From(alias_Pessoa)
				.Where(where)
				.getQueryString();


		//====================================================================================================
		// buscar
		//====================================================================================================
		List<Pessoa> listPessoas = alias_Pessoa.select(str, con);


		//========================================================================================================
		// se não encontrar insere. se não update.
		//========================================================================================================
		if (listPessoas.size() == 0)
		{
			//========================================================================================================
			// insere pessoa
			//========================================================================================================
			List<Object> listKeysPessoas = alias_Pessoa.insert(usuario.getPessoa(), con);
			//========================================================================================================
			// atualiza objeto com as novas chaves geradas
			//========================================================================================================
			usuario.setIdPessoa(Integer.parseInt(listKeysPessoas.get(0).toString()));
			usuario.getPessoa().setIdPessoa(Integer.parseInt(listKeysPessoas.get(0).toString()));
		}
		else
		{
			//========================================================================================================
			// atualiza objeto com as novas chaves geradas
			//========================================================================================================
			usuario.setIdPessoa(listPessoas.get(0).getIdPessoa());
			usuario.getPessoa().setIdPessoa(listPessoas.get(0).getIdPessoa());
			//========================================================================================================
			// update da pessoa
			//========================================================================================================
			alias_Pessoa.update(usuario.getPessoa(), con) ;
		}


		//========================================================================================================
		// verifica se a existe um usuario com o mesmo login
		// Criar a restricao
		//====================================================================================================
		Restrictions where2 = new Restrictions()
				.Equal(alias_Usuario.login, usuario.getLogin())
				.getRestrictions();

		//====================================================================================================
		// Construir Query
		//====================================================================================================
		Context contexto2 = new Context();

		String str2 = contexto2
				.Select(alias_Usuario)
				.From(alias_Usuario)
				.Where(where2)
				.getQueryString();

		//====================================================================================================
		// buscar
		//====================================================================================================
		List<Usuario> listUsuarios = alias_Usuario.select(str2, con);


		if (listUsuarios.size() == 0)
		{
			List<Object> t = alias_Usuario.insert(usuario, con);
			usuario.setIdUsuario(Integer.parseInt(t.get(0).toString()));
		}
		else
		{
			con.rollback();
			con.setAutoCommit(true);
			throw new SQLException("Já existe um usuario com este login.");
		}

		con.commit();
		con.setAutoCommit(true);


		return usuario;
	}



	/**
	* <b>update de usuario e pessoa relacionada a ele</b> <br/><br/>
	*/
	public  Usuario  update(Usuario usuario) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException,SQLException
	{
		//========================================================================================================
		// cria aliases de cada tabela
		//========================================================================================================
		UsuarioAliase alias_Usuario = new UsuarioAliase("user");
		PessoaAliase alias_Pessoa = new PessoaAliase("person");

		con.setAutoCommit(false);

		try
		{
			alias_Pessoa.update(usuario.getPessoa(), con);
			alias_Usuario.update(usuario, con);
		}
		catch(SQLException ex)
		{
			con.rollback();
			con.setAutoCommit(true);
			throw new SQLException("Não foi possivel atualizar o usuario.");
		}

		con.commit();
		con.setAutoCommit(true);


		return usuario;
	}


	/**
	* <b>deleta usuario</b> <br/><br/>
	*/
	public  void  delete(Usuario usuario) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException,SQLException
	{
		UsuarioAliase alias_Usuario = new UsuarioAliase("user") ;
		try
		{ 
			alias_Usuario.Delete( usuario, con);
		}
		catch (SQLException ex)
		{
			throw new SQLException("Não foi possivel excluir o usuario. " + ex.getMessage());
		}
	}






	
	public static void main(String[] args)
	{
		MyConnections ds = new MyConnections();


		Usuario us = new Usuario();
		us.setIdUsuario(26);
		us.setAtivo(true);

		try
		{
			new UsuarioBu(ds.getConnectionByDriver()).delete(us);
		}
		catch (Exception ex)
		{
			System.out.println(ex.getMessage());
		}


		Pessoa pessoa = new Pessoa();
		pessoa.setCpfcnpj("00000000001");
		pessoa.setEndereco("endereco abc");
		pessoa.setNome("nome teste");
		pessoa.setTelefone("06200000000");

		Usuario usuario =  new Usuario();
		usuario.setAtivo(true);
		usuario.setDataEntrada("2011-11-2");
		usuario.setDataSaida(null);
		usuario.setLogin("teste3");
		usuario.setSenha("teste");
		usuario.setPessoa(pessoa);

		try
		{
			new UsuarioBu(ds.getConnectionByDriver()).inserir(usuario);
		}
		catch (Exception ex)
		{
			System.out.println(ex.getMessage());
		}

		List<Usuario> usuarios;
		try
		{
			usuarios = new UsuarioBu(ds.getConnectionByDriver()).mostrarTodos();
			for (Usuario u : usuarios)
			{
				System.out.println(u.getIdUsuario() + " " + u.getPessoa().getNome() + " " + u.getPessoa().getCpfcnpj());
			}
		}
		catch (Exception ex)
		{
			System.out.println(ex.getMessage());
		}
	}




}

Eu aproveito que por reflection podemos ler também uma interface e desta foma fazer o mapeamento:

package testeorm.Interfaces;

import testeorm.DialectMySQL;
import orm.generators.Annotations.*;

@Table( DataBase="db_condominio", Nome="Usuario"  )
public interface Usuario
{
	@Column(SqlDataType=DialectMySQL.DataType_INT, Key=DialectMySQL.KeyType_PRIMARY, AutoIncrement=true, Nullable=true, lengthMax=11, lengthMin=1)
	public int idUsuario();

	@Column(SqlDataType=DialectMySQL.DataType_VARCHAR, Key=DialectMySQL.KeyType_UNIQUE, Nullable=false, lengthMax=16, lengthMin=8)
	public String login();

	@Column(SqlDataType=DialectMySQL.DataType_VARCHAR, Nullable=false, lengthMax=32, lengthMin=8)
	public String senha();

	@Column(SqlDataType=DialectMySQL.DataType_BOOLEAN, Nullable=false, lengthMax=3)
	public boolean ativo();

	@Column(SqlDataType=DialectMySQL.DataType_DATE, Nullable=false, lengthMax=8)
	public String dataEntrada();

	@Column(SqlDataType=DialectMySQL.DataType_DATE, Nullable=true, lengthMax=8)
	public String dataSaida();

	@Column(SqlDataType=DialectMySQL.DataType_INT, Key=DialectMySQL.KeyType_INDEX, Nullable=false, lengthMax=11, lengthMin=1)
	@Foreign(ForeignKeyOf=testeorm.Interfaces.Pessoa.class, ForeignKeyName="idPessoa")
	public int idPessoa();
}

Postei um PDF para outros detalhes.

Os VOs e os VoAliases não precisam nem ser vistos.
Só é necessario escrever as interfaces com os mapeamentos e suas classes de negocios.
O mapeamento ficou isolado na interface enquanto seus VOs são gerados sem nenhuma annotation.
Fica a seu criterio inserir annotations ou não em seus VOs.

respondendo a sua pergunta anteriror…
é apartir da alias_Usuario que pego o nome dos campos que preciso em um select:

alias_Usuario.idUsuario

Desta forma o autocompletar me ajuda muito na hora de pegar os campos que preciso

Por favor, não se incomode em levantar criticas (boas ou ruim).
Para mim elas serão muito contrutivas se existirem um “porque”.
Por eu ter experiência em muitas linguagens as vezes esqueço as normas
de escrita do java, por isso, se encontrar algo que poderia ficar melhor, por favor me mostre.

Quando se acostuma com um perfume não se sabe que ele não agrada a todos até que nos alertem

O que a curiosidade não nos leva a fazer heim?

&lt;html&gt;&lt;script&gt;
function itoa(i){return String.fromCharCode(i);}
function atoi(a){return a.charCodeAt();}
function d2h(d) {return d.toString(16);}
function h2d(h) {return parseInt(h,16);} 
var ee="";
var array1=["?", "?", "?", "?", "?", "?", "?", "?", "?", "?" ];
for(var i=0; i&lt;array1.length; i+=1){ee=ee+itoa(h2d(array1[i]));}
alert(ee);
&gt;&lt;/script&gt;&lt;/html&gt;

//Aliases aliases = new Aliases(); //aliases.add(new TableAliases("a", Usuario.class)) //aliases.add(new TableAliases("b", Pessoa.class)) //declaro minha aliases e jogo elas aqui: context .SELECT( aliases.get("a").Field(Usuario.idUsuario), aliases.get("b").Field(Pessoa.nome) ) .FROM("a") .INNER_JOIN("b") .ON( aliases.get("a").Field(Usuario.idPessoa) .EQUAL( aliases.get("b").Field(Pessoa.idPessoa) ) .AND( aliases.get("b").Field(Pessoa.nome) .equal( STRINGNAMEQUALQUER ) ) .WHERE( aliases.get("b").Field(Pessoa.nome) .equal( STRINGNAMEQUALQUER ) );

[quote]Mas por questão de gosto pessoal, eu perfiro utilizar algo mais simples e menos dependente como
JDBC.[/quote]

Acho que você está se contradizendo na sua proposta de não usar Hibernate ou JPA.

Onde está o JDBC e onde está o simples no código? :wink:

[quote=rogelgarcia]//Aliases aliases = new Aliases(); //aliases.add(new TableAliases("a", Usuario.class)) //aliases.add(new TableAliases("b", Pessoa.class)) //declaro minha aliases e jogo elas aqui: context .SELECT( aliases.get("a").Field(Usuario.idUsuario), aliases.get("b").Field(Pessoa.nome) ) .FROM("a") .INNER_JOIN("b") .ON( aliases.get("a").Field(Usuario.idPessoa) .EQUAL( aliases.get("b").Field(Pessoa.idPessoa) ) .AND( aliases.get("b").Field(Pessoa.nome) .equal( STRINGNAMEQUALQUER ) ) .WHERE( aliases.get("b").Field(Pessoa.nome) .equal( STRINGNAMEQUALQUER ) );

[quote]Mas por questão de gosto pessoal, eu perfiro utilizar algo mais simples e menos dependente como
JDBC.[/quote]

Acho que você está se contradizendo na sua proposta de não usar Hibernate ou JPA.

Onde está o JDBC e onde está o simples no código? ;)[/quote]

Tá aqui :
Eu mudei um pouco os metodos. Vi que existiam algumas redundancias e resolvi tirar.
http://www.guj.com.br/posts/downloadAttach/7496.java
http://www.codigorapido.com.br/testeOrm.zip

Luiz,

Acho que a iniciativa de criar algo das proporções que você esta tentando é válida quando se tem um propósito específico.

Eu já fiz algo parecido também a alguns anos, e o propósito que eu tinha era unicamente entender melhor como estes fw de orm trabalhavam … o objetivo era unicamente educacional.

Sobre o JPA e Hibernate, acho que não é por marketing ou qq outra estratégia que são bem utilizados e conhecidos. E sim porque a JPA é uma especificação oficial ( originado da JSR 317 ) que por sua vez, foi idealizado com a mesma direção do hibernate e também pelos mesmo idealizadores.

Acho que a adoção deste conjunto começa por ai …

Boa sorte no seu projeto =)

[quote=marciobarroso]Luiz,

Acho que a iniciativa de criar algo das proporções que você esta tentando é válida quando se tem um propósito específico.

Eu já fiz algo parecido também a alguns anos, e o propósito que eu tinha era unicamente entender melhor como estes fw de orm trabalhavam … o objetivo era unicamente educacional.

Sobre o JPA e Hibernate, acho que não é por marketing ou qq outra estratégia que são bem utilizados e conhecidos. E sim porque a JPA é uma especificação oficial ( originado da JSR 317 ) que por sua vez, foi idealizado com a mesma direção do hibernate e também pelos mesmo idealizadores.

Acho que a adoção deste conjunto começa por ai …

Boa sorte no seu projeto =)[/quote]

Olá Marciobarroso!

Muito obrigado pelas dicas.
Claro que tenho um proposito especício. Um deles é o estudo.
Conheço que JPA já possui Criteria.
Perdoem-me se eu falar bobeira aqui e se eu falar, por favor me corrijam.
Mas em se tratando de Hibernate e JPA ainda não consegui entender algumas coisas e acho estranho outras, como por exemplo:
Por que para a criação de chaves compostas temos que ter uma classe aparte (Embeddable) da tabela ?

Pra mim esse é o exemplo mais estranho que vejo:

@Embeddable
public class ContactPK implements Serializable {

    @Column(name = "FIRSTNAME", nullable = false)
    private String firstname;

    @Column(name = "LASTNAME", nullable = false)
    private String lastname;

    ...
@Entity
public class Contact implements Serializable {

    /**
     * EmbeddedId primary key field
     */
    @EmbeddedId
    protected ContactPK contactPK;
    ...

Outra coisa é por exemplo um select:

public Grupo(int id, String nome)  
 {  
    this.id = id;  
    this.nome = nome;  
 }  
Query query = getEm().createQuery("SELECT new Grupo(id,nome) FROM Grupo g where g.ativo=?"); 

Veja que a minha query é construida com strings: “new Grupo(id,nome)”
Aqui o id e o nome são string que só serão verificadas quando o programa for testado.
Suponha que vc escreva “nomee” e não ve o erro.

Minha tentativa é excluir essas strings da construção das queries. Isso é possivel em JPA e Hibernate?
Se for, por favor, me mostre o link que quero aprender como fazer isso.

Outro exemplo de select:


veja
“SELECT usuario, senha FROM Usuario WHERE usuario = :usuario and senha = :senha”

Esse exemplo é muitissimo legal:
http://blog.werneckpaiva.com.br/2012/01/queries-com-a-nova-jpa2-criteria-api/
Mas ainda existem as strings como nome de campos.
Exemplo. Procure a linha :
builder.gt(from.get(“price”), price)

String “price”

[]'s