Hibernate e Primary Key

10 respostas
A

Estou tentando fazer alguns testes com o Hibernate, e meu primeiro problema é em relação a primary Key.

Tenho uma primary key do tipo int.

Quando eu tento gravar um valor, ele nao grava, vai como null.
Eu sei que dentro do Bean o valor esta correto, pois antes de gravar eu vejo o valor do codigo e o valor esta correto.

dentro do meu bean, eu uso assim:

/**
	 * @hibernate.id
	 * 	generator-class="native"
	 * @return Returns the codigo.
	 */
	public int getCodigo() {
		return codigo;
	}

Quando eu rodo o Ant com o xDoclet, ele gera o arquivo Clientes.hbm.xml, e no id fica assim

<id
            name="codigo"
            column="codigo"
            type="int"
        >
            <generator class="native">
            </generator>
        </id>

mesmo assim continua gravando null.

alguem sabe o que pode ser fazendo favor?

Obrigado

10 Respostas

rodrigousp

Eu não sei se consigo te ajudar muito não.
Mas seguem duas observações

louds

Ahh, não use tipos primitivos como primarykey, não é recomendado.

A

então louds, mudei para Integer e continua não gravando certo

<id
            name="codigo"
            column="codigo"
            type="java.lang.Integer"
        >
            <generator class="native">
            </generator>
        </id>

e o meu Bean

/**
	 * @hibernate.id generator-class="native"
	 * @return Returns the codigo.
	 */
	public Integer getCodigo() {
		return codigo;
	}

Alguma idéia?

louds

Hmm

Native exige que o banco gere para voce a key, tua pk é auto increment ou usa alguma sequence como valor padrão?

A property esta indo com valor null para o hibernate salvar?

Voce está chamando flush()?

A

“louds”:
Hmm

Native exige que o banco gere para voce a key, tua pk é auto increment ou usa alguma sequence como valor padrão?

A property esta indo com valor null para o hibernate salvar?

Voce está chamando flush()?

Ola Louds,

é o seguinte, no banco de dados (MySQL) está como int. Ele não é auto increment, na verdade o usuário irá digitar o código (esse é apenas um teste, mas no futuro eu irei fazer um auto-incremento mas nao pelo banco e sim pelo próprio software).

no DAO está assim

public void insert(Clientes clientes) throws HibernateException, SQLException {
		Session sessao = factory.openSession();
		sessao.save(clientes);
		sessao.connection().commit();
		sessao.flush();
		sessao.close();
	}

a versão do hibernate é a 2.1.2

ah, esqueci de falar…

dentro do Bean Clientes o atributo codigo está indo com o valor normal, mas na hora de gravar no banco grava como null (como é PK, ele grava 0 invés de null, pois eu deixei default 0).

Quando é um outro tipo de campo int, que não seja PK, ele grava normalmente

lcmetzger

Tente fazer assim:

<id name="codigo" column="codigo" type="java.lang.Integer" > <generator class="assigned"> </generator> </id>

T+

A

“lcmetzger”:
Tente fazer assim:

<id name="codigo" column="codigo" type="java.lang.Integer" > <generator class="assigned"> </generator> </id>

T+

mudei o generator-class para “assigned” e agora não gravou nada no Banco de Dados, com generator-class “native” grava tudo menos o PK

isso está cada vez mais estranho

lcmetzger

humm, realmente está estranho,

tente mudar a coluna código para auto-incremento e utilize NATIVE no mapeamento.

no seu bean mude de Integer para Long, e confira os getter e setters para ver se não existe nada de errado.

T+

A

vou falar as coisas que eu fiz e o que ocorreram:

  • PK Integer e generator-class=“native” - grava sempre null na PK
  • PK Integer e generator-class=“assigned” - não grava nada
  • PK Long e generator-class = “native” - se o codigo for auto-incremento grava o valor do Bean, senao grava null.
  • PK Long e generator-class=“assigned” nao grava nada.

A conclusão que eu tive é a seguinte…
Se eu precisar de uma PK auto-incremento, eu uso Integer, senao eu uso Long…

agora eu não sei a diferença de native para assigned. O Lance é estudar a documentação para não ficar perdido e cheio de dúvidas

lcmetzger

Utilizo o XDoclet para criar os arquivos .hbm.xml, e utilizo o mapeamento abaixo:

/**
	 * @hibernate.id 
	 *    generator-class="native"
	 *    column="ID"
	 *    unsaved-value="null"
	 * @hibernate.generator-param 
	 *    name="sequence" 
	 *    value="SQ_CLIENTE"
	 */
	public Long getId() {

		return id;
	}

	protected void setId(Long id) {
		this.id = id;
	}

Observe que este mapeamento está sendo utilizado tanto para Oracle como para o PostgreSQL, em ambos eu declaro uma SEQUENCE para gerar chaves primárias únicas.

Como no seu caso é utilizado o MySQL, o mesmo não possue o conceito de SEQUENCES, mas sim, colunas do tipo IDENTITY (Acho que é isto, faz um bom tempo que não utilizo MySQL), que a cada registro incluído o mesmo será incrementado.

Bom… seguindo com o exemplo do mapeamento, se eu simplesmente substituir o meu banco de dados Oracle pelo MySQL, o Hibernate “saberia” que o MySQL não utiliza Sequences como estratégia para campos de autoincremento, e iria ignorar a TAG @hibernate.generator-param. Observe também, que indico para o Hibernate de que quando o ID == NULL, trata-se de uma inclusão.

Não sei se consegui ser claro, qualquer coisa estamos ai!

:slight_smile:

Criado 10 de fevereiro de 2004
Ultima resposta 11 de fev. de 2004
Respostas 10
Participantes 4