[RESOLVIDO] JPA - Obter chave gerada por Sequence em Trigger

Entendi, achei que ele ficava com o da trigger, ai realmente fud@@ de vez … rsrs

Uma vez que tentar recuperar novamente o objeto você não poderá contar com o valor atual da sequence, já que alguém pode estar a modificando, a não ser que você crie um mecanismo para poder recupera-la sem erros, bem isso é gambi rs.

Mas até ai desacopla-los e depois acopla-los não é um problema e sim a sequence :stuck_out_tongue:

Já que existe uma trigger que inclui o ID automaticamente na tabela, por que você não configura este ID como uma coluna de auto incremento, já testou isto?

   @Id  
   @Column(name="ID_PAI", nullable = false)      
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

flw

É Oracle e o sequence já é auto incremento…

via SQL: (insert…minha_sequence.NEXTVAL).

Este comendo pode ser utilizado tanto para inserir quanto para saber qual o próximo ID.

Espero ter ajudado de alguma forma.

[quote=alexlima72]É Oracle e o sequence já é auto incremento…

via SQL: (insert…minha_sequence.NEXTVAL).

Este comendo pode ser utilizado tanto para inserir quanto para saber qual o próximo ID.

Espero ter ajudado de alguma forma.[/quote]

Acredito que todos aqui saibam disto, mas você leu qual é o motivo do problema? Que existe uma trigger que insere o ID antes do insert ser executado.

flw

AUTO, deixará o provedor escolher a melhor estrategia para o banco de dados inferior, no caso se for o oracle provavelmente a escolha é SEQUENCE.

[quote=lap_junior]Já que existe uma trigger que inclui o ID automaticamente na tabela, por que você não configura este ID como uma coluna de auto incremento, já testou isto?

   @Id  
   @Column(name="ID_PAI", nullable = false)      
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

flw[/quote]

Acabei copiando errado, não AUTO mas sim IDENTITY. Isso porque com esta trigger esta coluna funciona como se fosse autoincremento.

Não lembro se Oracle suportam colunas de identidade… tem de testar.

Acho que não, de qualquer forma acho que o problema continuaria.

[quote=lap_junior][quote=lap_junior]Já que existe uma trigger que inclui o ID automaticamente na tabela, por que você não configura este ID como uma coluna de auto incremento, já testou isto?

   @Id  
   @Column(name="ID_PAI", nullable = false)      
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

flw[/quote]

Acabei copiando errado, não AUTO mas sim IDENTITY. Isso porque com esta trigger esta coluna funciona como se fosse autoincremento.[/quote]

O Oracle não suporta colunas IDENTITY. Isso é usado no SQL Server e outros…

Paz e bem!

anyone? :roll:

Putz ainda nada T_T, tentou outras alternativas cara? Posta aí para discutirmos.

Nessa mesma tabela, você grava um campo TimeStamp?

questão complicada, considere estender o hibernate e criar sua própria estratégia de geração de sequence.

O.o rs

É pessoal, fui ver com uns colegas aqui e eles tiveram que usar um GenericGenerator (que herda de AbstractPostInsertGenerator e implementa Configurable) para resolver o problema. Ou seja, dentro do Generator faz-se um ‘select curval’ da vida… Vale lembrar que o GenericGenerator é Hibernate e não JPA.

@Entity  
@Table(name = "PAI")  
public class Pai implements Serializable {  

@Id  
@Column(name="ID_PAI", nullable = false)      
@GeneratedValue(generator="PaiSeq")
@GenericGenerator(name = "PaiSeq", strategy = "br.com.guj.GeneratorTabajara", parameters = { @Parameter(name = "sequence", value = "PAI_SQ") })
private int id;  
   
@OneToMany(mappedBy="pai", fetch = FetchType.LAZY)  
private List<Filho> filhos;  

//gets, sets etc.  
}

Bom, está aí. Boa pedida para o JPA na próxima versão pois, ninguém merece ficar criando ‘workarrounds’…

Paz e bem!

Justo.

Olá pessoal, blz?

Como me procuraram afim de sabem qual solução eu havia usado, passo o link de um post no fórum do Hibernate com a solução: https://forum.hibernate.org/viewtopic.php?p=2379010

Valeu!

acredito que a dica do rapaz ali que disse pra usar IDENTY funcionaria, pois a trigger esta simulando um campo AUTO_INCREMENT. Tive um problema semelhante aqui, facilitei a vida de todos, e utilizei a estrategia SEQUENCE e deletei as triggers.

Na verdade, acho esse lance de usar trigger pra gerar ID, uma verdadeira gambiarra