Hibernate sem primary Key

Bom dia,

Pessoal estamos com um problema sério aqui no trabalho.

Estamos migrando um sistema aqui onde o banco tem mais de 200 tabelas e 70% estão sem primary key.

Então a pergunta é. Séra que podemos colocar o hibernate para mapear o banco sem dar problema com as primary keys, pois o pessoal aqui não quer mecher no banco.

Att,

Fabiano

Hum… boa pergunta. Pelo hibernate reference é orientado:

5.1.4. id
Mapped classes must declare the primary key column of the database table. Most classes will also have a JavaBeans-style property holding the unique identifier of an instance. The <id> element defines the mapping from that property to the primary key column.

Segue o link:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/mapping.html#mapping-declaration-id

Inté :wink:

luizrobertofreitas

Então posso fazer o mapeamento sem nenhum problema.

O grande problema que vou ter é que não vou conseguir usar um gerador do tipo MyGeneration para gerar os relacionamento já que não existem.

Estou certo ou errado?

Att,

Fabiano

Não é possível usar HIbernate sem PK. Você vai precisar definir alguns atributos em comum e usar uma chave composta ou, se possível, definir um único atributo e defini-lo como PK.

Quando à geração do valor dessa PK…vai depender da sua base.

Não, assim como o Giulliano disse anteriormente, já mata a dúvida. O hibernate utiliza o atributo que seria o Id para realizar os mapeamentos. No caso do FetchType = Lazy (Utilizados para relacionamentos entre classes) para relacionamentos ManyToOne, não faria sentido não ter algum atributo Id na Classe. No texto em versão inglês, o documento diz que "Classes mapeadas devem declarar uma coluna primary key de uma tabela de banco de dados "

Inté

Entendi,

Nem se eu forçar, fizer o mapeamento do banco, ou seja, um exemplo tenho uma tabela de clientes com o atributo clie_idcliente_s (varchar(08)) e uma tabela contato com o atributo cont_idcliente_s varchar(08), ou seja eles não estão marcado com PK, mas sabemos que o cont_idcliente_s é FK e clie_idcliente_s é a PK, mas no banco não estão marcados como PK

<id name="Codigo" column="clie_idcliente_s" type="String" length="08">
      <generator class="assigned" />
    </id>
    <property name="Nome" column="Nome" type="String" length="45" />

<!-- Mapeamento da Coleção de Contatos -->
    <set name="contato" inverse="true"  lazy="true" >
      <key column ="cont_idcliente_s" />
      <one-to-may class="testeHibernate.contato, testeHibernate" />
    </set>

Isso não funcionaria quando eu fosse fazer um join para pegar os contatos do cliente?

Att,

Fabiano