Auto incremento hibernate

Oi pessoal,

estou desenvolvendo uma aplicação utilizando o hibernate que vai utilizar dois SGBD’s: PostgreSQL e SQLServer.
Baseado nisso, estou fazendo um mapeamento padrão que funcione nos dois bancos, pois até onde eu sei as
anotações do hibernate não é ‘100%’ iguais para todos SGBD’s.

Estou com um problema no auto-incremento:

No postgreSQL tenho que criar senquencia, como exemplo:

@SequenceGenerator(sequenceName="<nome_schema>.<nome_sequencia>", name = "<nome_sequencia>") @Id @GeneratedValue(generator="<nome_sequencia>") @Column(name = "<nome_coluna>") private Integer codigo;

No SQLServer faço dessa maneira:

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "<nome_coluna>") private int codigo;

Alguém sabe uma anotação padrão que vai funcionar nos dois SGBD’s?

Esse foi o primeiro problema que encontrei, espero que não venham outros, eheheh…

Obrigado a todos!

Olha, com anotação eu não sei se tem um mapeamento padrão para auto incremento.
Utilizo o mapeamento com o arquivo XML e não tem mapeamento padrão, cada SGBD tem um tipo de mapeamento diferente. Na empresa que trabalho, utiliza-ze o Informix e Oracle e quando me deparei com essa situação, tive que criar dois arquivos XML, cada contendo o mapeamento de cada banco e uma classe Java, porque no final das contas é um numérico, que no meu caso era um Integer.

Pois é, mas no meu caso as anotações estão diretamente nas classes.

Continuando as pesquisas… :roll:

Li em algumas referências que alguns bancos como o PostgreSQL trabalha com SEQUENCE e outros bancos como SQL Server trabalha com IDENTITY.
E existe uma forma que seria mista, que é a estratégia de INCREMENT, pelo que percebi ela faz uma consulta no banco pega o max da chave primária e soma 1 automaticamente.
Porém não consegui funcionar esse INCREMENT, alguem sabe a respeito ou tem outra idéia para meu problema?

Obrigado.

Vi alguns exemplos que no xml o pessoal mapeia assim:

<id name="id"> <generator class="native"/> </id>

Ai, o hibernate pega o modo nativo de cada banco.

Como faço isso através de anotações???

Tenta GenerationType.AUTO mas eu acho que o Hibernate não tem como saber qual sequence pra tabela…

Ahh se não me engano você precisa criar uma sequence chamada hibernate_sequence.

Pois é Rodrigo,

já tentei com o strategy =GenerationType.AUTO mas não deu certo.

Mais alguma idéia???

Olá Maurenginaldo,

Eu usei jpa+hibernate e usei @TableGenerator para gerar o valor da chave primaria das tabelas.

Como está anotação você cria uma table que é responsável pela a geração da chave. O único incoveniente

é o fato de ter mais uma tabela em seu banco para controlar isso. Porém, você não se preocupar com

o SGBD e fica sendo controlado por você essa geração de IDs.

Examplo:


@Entity
@Table(name = "USUARIO")
@TableGenerator(name = "USUARIO_GEN", table = "GENERATOR_ID", pkColumnName = "ID", valueColumnName = "VALOR", pkColumnValue = "USUARIO", allocationSize = 1)

public class Usuario implements Serializable 
{

        @Id
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "USUARIO_GEN")
	private Integer ID;

	@Column(name = "NOME_CURTO", length = 30)
	public String nome_curto;

        (...)

        gets e sets

}

Att,

Oi Mirla,

testei da forma que vc descreveu e deu certinho!!!
Muito obrigado pela ajuda.

Abracos,