quinta-feira, 29 de janeiro de 2009

Firebird + JPA e o Problema com o Generator

Resolvi fazer este post depois de muito sofrer para integrar o JPA com o Firebird. O grande problema que eu encontrei foi com o esquema de geração de ids do firebird. Firebird usa um esquema chamado de Generator, é muito parecido com esquema de sequences de bancos como oracle. Então vamos à solução do problema. Abaixo temos a nossa entidade Aluno, com as anotações do JPA. (omitimos os imports e os get/set, pois o foco é no generator.
@Entity
@Table(name="TB_BAIRRO")
@SequenceGenerator(name="GEN_TB_BAIRRO",sequenceName="GEN_TB_BAIRRO_ID")
public class Bairro extends BaseEntity {

@Id
@Column(name="BAIRRO_SEQ")
@GeneratedValue(strategy=GenerationType.AUTO,generator="GEN_TB_BAIRRO")
private Integer id;

@Column(name="BAIRRO_DSC")

private String descricao;

Definimos na classe qual é a sequence (no firebird Generator) que vai ser usada pra gerar a primary da key da tabela. O atributo name é importante pois ele vai ser usado, como pode ser visto acima, na anotação GeneratedValue, cuja strategy deve ser do tipo AUTO, e no parâmetro generator, informamos o nome que demos à nossa SequenceGenerator da tabela.
Até o nosso próximo post!

5 comentários:

  1. Valeu cara, me ajudou muito. Já tinha esquecido como se faz heheheheh

    ResponderExcluir
  2. Ola Robson
    Mto bom seu exemplo acima.
    Tentei usar mas esta dando um erro para mim :

    [TopLink Info]: 2010.08.02 02:07:40.187--ServerSession(17298525)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))
    [TopLink Info]: 2010.08.02 02:07:40.296--Not able to detect platform for vendor name [Firebird 2.13WI-V2.1.3.18185 Firebird 2.1/tcp (programador3)/P10]. Defaulting to [oracle.toplink.essentials.platform.database.DatabasePlatform]. The database dialect used may not match with the database you are using. Please explicitly provide a platform using property toplink.platform.class.name.
    Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Exception [TOPLINK-7144] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException
    Exception Description: GEN_NOMES: platform DatabasePlatform doesn't support NativeSequence.
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:239)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)

    ResponderExcluir
    Respostas
    1. Boa noite! Tente isso:
      @Id
      @GeneratedValue(generator = "inc")
      @GenericGenerator(name = "inc", strategy = "increment")
      private Long id;

      Excluir
  3. Ola Robson
    Sou novato em JAVA e estou desenvolvendo aplicacao com Hibernate JPA e FIREBIRD.
    Li em varios lugares que o FIREBIRD é incompativel com JPA .
    Como vc fez rodar sua aplicacao exemplo.
    Tentei usar seu exemplo e deu erro acima.
    Qual seu email ?? o meu é gabriel@mgsystem.inf.br
    Obrigado

    ResponderExcluir