Auto incremento em JPA

Pessoal, estou com problemas em gerar campos de auto incremento com o JPA.
Seguinte…
Se o campo serial for o Id, a sequência é gerada no postgres normalmente:

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long numero;

Mas se tento pôr um campo auto incremento que não seja o Id, a sequência não é gerada no banco:

	@Id
	private long cpf;

	@GeneratedValue(strategy=GenerationType.IDENTITY, generator="pessoa_cod_seq")
	private int cod;

Alguma alma generosa teria, por favor, o remédio para essa minha dor de cabeça???
Já tentei também GenerationType.SEQUENCE e GenerationType.AUTO

O Hibernate só vai gerar a chave pra você se o seu atributo for anotado também como @Id.

O problema não está sendo a chave primária, isso ele gera.
O que não está gerando eh a sequencia do campo que quero que seja auto incremento. E este campo, não necessariamente, precisa ser a chave primária.

[quote=michellefpc]O problema não está sendo a chave primária, isso ele gera.
O que não está gerando eh a sequencia do campo que quero que seja auto incremento. E este campo, não necessariamente, precisa ser a chave primária.[/quote]

Mas é isso que estou querendo dizer. Se ele não for a chave primária, o Hibernate não irá gerar pra você.

Eu estou usando o auto incremento e não está funcionando. Meu banco de dados é Oracle

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
 	private BigDecimal numidentificador;

O erro que dá é este:

org.hibernate.HibernateException: could not get or update next value
	at br.unesp.sisor.dao.BaseDao.saveOrUpdate(BaseDao.java:47)
	at br.unesp.sisor.action.gerais.SisorProcessoSalvarAction.execute(SisorProcessoSalvarAction.java:70)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:218)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:119)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
	at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
	at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:230)
	at oracle.oc4j.network.ServerSocketAcceptHandler.access$800(ServerSocketAcceptHandler.java:33)
	at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:831)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
	at java.lang.Thread.run(Thread.java:595)

Auto incremento só funciona com tipos de dados inteiros e seus wrappers.

Opa Michelle, acredito que se você estiver usando sequence no Postgree de para fazer da seguinte forma:

@GeneratedValue(generator = <nome_sequence> )
@Column(name=<nome_coluna> )
@SequenceGenerator(name = <nome_sequence> sequenceName = <nome_sequence> )
private Long id;

Não tenho certeza pq soh testei no Oracle, mas como Postgree tb trabalha com sequence acredito que funcione.

[]'s

O nome da sequencia vai na anotação @SequenceGenerator

@SequenceGenerator(name=“SEQ”, sequenceName="")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=“SEQ”)

JN

Estou mandando um exemplo de um projeto meu que gera Id da Entidade pela sequence.

@GeneratedValue(generator=“GENERATE_CLIENTS”, strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name=“GERATE_CLIENTS” , sequenceName=“financeiro.clients_pk_clients_seq” , allocationSize=1)

Um…michellefpc acho que agora que entendi a sua questão, é mesma da minha.
No meu caso tenho tabelas que não tem chaves primárias mas que tem campos com auto incremento
Preciso buscar valores de uma view que se encontra no banco através de JPA.
Tem alguma forma de pegar esses valores pela JPA pessoal? :roll:

Caraca… tb tenho o mesmo problema, tenho um campo que não é chave primária, mais ele tem que ser um auto increment… só que no hibernate as amotaçao @eneratedValue só é para atributo que tenham a anotaçao @Id
Ta dificil hem…

xD

Fui ler pra ter certeza: na seção 9.1.9 da JPA diz que @GeneratedValue so pode ser usado pra primary key. Nao é comportamento incorreto do hibernate.

Pra voce se esquivar dessa, minha sugestao é que voce gere o schema e então depois de um Alter Table para mudar a coluna para AUTO INCREMENT, e utilize a anotacao do hibernate @Entity com dynamic-insert e dynamic-update, assim ele nao ira inserir esse valor quando voce fizer um save/update/,erge, e o banco de dados que o tratara.

Paulo, então vc quer dizer que se eu n setar um valor à uma variavel de instancia utilizando o SET, o hibernate deixará que o banco de dados atribua o valor ao campo respectivo na tabela se eu utlizar @Entity com dynamic-insert e dynamic-update… ?