não consigo fazer auto incremento com hibernate

Gostaria que o atributo codigo_produto fosse autoincremento, entretanto na tabela no banco esta ficando null, alguém poderia me dar uma ajuda?
Segue classe:

package br.com.sapatos.sapatos.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

import com.sun.istack.internal.NotNull;

@Entity
public class Produto {

@Id
private Long codigo_barras;

@GeneratedValue @NotNull
private Long codigo_produto;

private String cor;
private String modelo;
private String marca;
private String tipo;

private int tamanho;

private char codigo_verificador;

private double preco;

// Construtor - recebe o código de barras
public Produto(Long codigo_barras) {

	if (codigo_barras == null) {
		throw new IllegalArgumentException(
				"Código de barras não pode ser nulo");
	} else if (codigo_barras <= 0) {
		throw new IllegalArgumentException(
				"Código de barras não pode ser negativo");
	} else
		this.codigo_barras = codigo_barras;
}

public Long getCodigo_barras() {
	return codigo_barras;
}

public String getCor() {
	return cor;
}

public void setCor(String cor) {
	this.cor = cor;
}

public String getModelo() {
	return modelo;
}

public void setModelo(String modelo) {
	this.modelo = modelo;
}

public String getTipo() {
	return tipo;
}

public void setTipo(String tipo) {
	this.tipo = tipo;
}

public int getTamanho() {
	return tamanho;
}

public void setTamanho(int tamanho) {
	this.tamanho = tamanho;
}

public Long getCodigo_produto() {
	return codigo_produto;
}

public char getCodigo_verificador() {
	return codigo_verificador;
}

public void setCodigo_verificador(char codigo_verificador) {
	this.codigo_verificador = codigo_verificador;
}

public String getMarca() {
	return marca;
}

public void setMarca(String marca) {
	this.marca = marca;
}

public double getPreco() {
	return preco;
}

public void setPreco(double preco) {
	this.preco = preco;
}

}

Até onde sei o @GeneratedValue pode ser usado apenas em @Id, fiquei intrigado com sua dúvida e fui atrás e achei essa solução:

http://stackoverflow.com/questions/277630/hibernate-jpa-sequence-non-id

Aqui mostra como usar IDs: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

Primeiro você tem que usar o tipo adequado para seu banco de dados, e caso seu banco suporte auto-incremento veja se está configurado para incrementar.

só mais uma dica

@NotNull é uma validação, então troque seu import

Por esse

import javax.validation.constraints.NotNull;

Primeiramente, obrigado pelas respostas. Então tenho que colocar o campo codigo_produto como auto_incremento no banco de dados, que a proposito é o mysql. Hebert qual tipo sugeri para meu campo e então tenho que colocar codigo_produto no banco como auto_incremento?

Gustavo li o artigo do link que me passou, entretanto ainda não consegui, por acaso conseguiu fazer algo parecido ?

[quote=marceloamerico]Primeiramente, obrigado pelas respostas. Então tenho que colocar o campo codigo_produto como auto_incremento no banco de dados, que a proposito é o mysql. Hebert qual tipo sugeri para meu campo e então tenho que colocar codigo_produto no banco como auto_incremento?

Gustavo li o artigo do link que me passou, entretanto ainda não consegui, por acaso conseguiu fazer algo parecido ?[/quote]

legal essa sua dúvida, até hoje nunca precisei de um auto_increment se não fosse para o id. Mas, naquela solução que o Hebert passou, foi um workaround que o cara fez um relacionamento oneToOne e pega o id da outra entidade apenas. Se vc fez o relacionamento correto deve ter obtido o resultado.
Pelo que vi o @GeneratedValue só funciona com o @Id. Mas, vc tentou colocar na tabela do seu banco a coluna com o auto_increment e deixa o campo anotado na classe e ver o que rola?

Continuo no meu dilema e agora esta apresentando o seguinte erro:

2012-12-20 22:42:54,546[HH:mm:ss] INFO [Version] Hibernate Annotations 3.4.0.GA
2012-12-20 22:42:54,578[HH:mm:ss] INFO [Environment] Hibernate 3.3.2.GA
2012-12-20 22:42:54,578[HH:mm:ss] INFO [Environment] loaded properties from resource hibernate.properties: {hibernate.connection.driver_class=com.mysql.jdbc.Driver, hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider, hibernate.max_fetch_depth=1, hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect, hibernate.jdbc.use_streams_for_binary=true, hibernate.format_sql=true, hibernate.query.substitutions=yes ‘Y’, no ‘N’, hibernate.proxool.pool_alias=pool1, hibernate.connection.username=root, hibernate.cache.region_prefix=hibernate.test, hibernate.hbm2ddl.auto=update, hibernate.connection.url=jdbc:mysql://localhost/sapatos, hibernate.bytecode.use_reflection_optimizer=false, hibernate.show_sql=true, hibernate.connection.password=****, hibernate.jdbc.batch_versioned_data=true, hibernate.connection.pool_size=1}
2012-12-20 22:42:54,578[HH:mm:ss] INFO [Environment] using java.io streams to persist binary types
2012-12-20 22:42:54,578[HH:mm:ss] INFO [Environment] Bytecode provider name : javassist
2012-12-20 22:42:54,593[HH:mm:ss] INFO [Environment] using JDK 1.4 java.sql.Timestamp handling
2012-12-20 22:42:54,718[HH:mm:ss] INFO [Version] Hibernate Commons Annotations 3.1.0.GA
2012-12-20 22:42:54,734[HH:mm:ss] INFO [HibernateSearchEventListenerRegister] Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
2012-12-20 22:42:54,828[HH:mm:ss] INFO [AnnotationBinder] Binding entity from annotated class: br.com.sapatos.sapatos.model.Produto
2012-12-20 22:42:54,875[HH:mm:ss] INFO [EntityBinder] Bind entity br.com.sapatos.sapatos.model.Produto on table Produto
Exception in thread “main” org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.sapatos.sapatos.model.Produto.codigo_produto references an unknown entity: br.com.sapatos.sapatos.model.Sequencia
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)
at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at br.com.sapatos.sapatos.controller.AdicionaProduto.main(AdicionaProduto.java:20)

Classe Produto:

package br.com.sapatos.sapatos.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Produto {

@Id
private Long codigo_barras;

@OneToOne
private Sequencia codigo_produto;

private String cor;
private String modelo;
private String marca;
private String tipo;

private int tamanho;

private char codigo_verificador;

private double preco;

// Construtor - recebe o código de barras
public Produto(Long codigo_barras) {

	if (codigo_barras == null) {
		throw new IllegalArgumentException(
				"Código de barras não pode ser nulo");
	} else if (codigo_barras <= 0) {
		throw new IllegalArgumentException(
				"Código de barras não pode ser negativo");
	} else
		this.setCodigo_barras(codigo_barras);
}

public Produto(){
	
}


public String getCor() {
	return cor;
}

public void setCor(String cor) {
	this.cor = cor;
}

public String getModelo() {
	return modelo;
}

public void setModelo(String modelo) {
	this.modelo = modelo;
}

public String getTipo() {
	return tipo;
}

public void setTipo(String tipo) {
	this.tipo = tipo;
}

public int getTamanho() {
	return tamanho;
}

public void setTamanho(int tamanho) {
	this.tamanho = tamanho;
}

public char getCodigo_verificador() {
	return codigo_verificador;
}

public void setCodigo_verificador(char codigo_verificador) {
		this.codigo_verificador = codigo_verificador;
}

public String getMarca() {
	return marca;
}

public void setMarca(String marca) {
	this.marca = marca;
}

public double getPreco() {
	return preco;
}

public void setPreco(double preco) {
	this.preco = preco;
}


public Long getCodigo_barras() {
	return codigo_barras;
}

public void setCodigo_barras(Long codigo_barras) {
	this.codigo_barras = codigo_barras;
}

}

e a classe Sequencia:

package br.com.sapatos.sapatos.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Sequencia {

@Id
@GeneratedValue
private Long codigo_produto;

}

eu criei essa classe sequencia e uma tabelas sequencia também e relacionei no banco com a tabela produto, só que não tenho certeza se é assim?