Hibernate Composite ID

Ola,

Alguem ja teve experiencia com composite ID no Hibernate ?

[quote=zap]Ola,

Alguem ja teve experiencia com composite ID no Hibernate ?[/quote]

sim! … da um alhada nos comentarios q fiz nesses 2 posts

http://www.guj.com.br/posts/list/121586.java

http://www.guj.com.br/posts/list/121523.java

Ola Lavieri,

Tinha lido esses dois posts, ainda agora a pouco. Posts muito uteis por sinal …

Estou com um problema com um mapeamento. Um dos atributos da PK que faz parte do composite-id eh um outro objeto.

public class EntidadeNegocioPK{
  private Integer idUnidade;
  private Integer idEmpresa;
}

public class EntidadeNegocio{
  private EntidadeNegocioPK entidadeNegocioPK;
  private String tipo;
}

public class ItemPedidoPK{
  private EntidadeNegocioPK entidadeNegocioPK;
  private Integer idItem;
}

public class ItemPedido{
  private ItemPedidoPK itemPedidoPK;
  private String descricao;
  private Double preco;
}

O meu problema eh justamente mapear (no meu caso estou usando atraves do arquivo XML) o ItemPedido que tem na tabela ITEM_PEDIDO as seguintes chaves compostas ( ID_UN, ID_EMP, ID_ITEM ) no composite-id

<composite-id name="ItemPedidoPK" class="entidade.ItemPedidoPK">

<key-property name="entidadeNegocioPK.idUnidade" column="id_un" type="java.lang.Integer" />
<key-property name="entidadeNegocioPK.idEmpresa" column="id_emp" type="java.lang.Integer" />
<key-property name="idItem" column="id_item" type="java.lang.Integer" />

</composite-id>

Eu Precisaria de algo do tipo “entidadeNegocioPK.idUnidade” para que encontrasse o atributo correto, mas dessa forma nao funciona :frowning:

Tem alguma dica ?

não sei e não gosto de mapear por xml

mais pelo que entendo, vc não deve mapear a PK com outra PK e sim com seus devidos atributos…

então ficaria algo assim

[code]<composite-id name=“ItemPedidoPK” class=“entidade.ItemPedidoPK”>

<key-property name=“idUnidade” column=“id_un” type=“java.lang.Integer” />
<key-property name=“idEmpresa” column=“id_emp” type=“java.lang.Integer” />
<key-property name=“idItem” column=“id_item” type=“java.lang.Integer” />

</composite-id> [/code]

Entao, dessa forma tinha testado e realmente funciona.

Mas o caso de criar uma classe com os atributos idUnidade e idEmpresa eh devido a necessidade desses atributos em muitas outras classes, como Pedido e Vendedor, pois nas tabelas mapeadas por estas classes sempre existem os campos ID_UN e ID_EMP.

O fato de usar a classe EntidadeNegocioPK como um atributo de ItemPedidoPK eh simplesmente por ter os atributos necessarios (idUnidade e idEmpresa), mas de fato nem precisaria ser uma classe de PK, poderia ser qualquer outra, desde que tivesse os atributos.

No composite-id eu nao poderia ter um dos <key-property> sendo um atributo do tipo objeto de outra classe ?

Esse eh o problema que eu encontrei para mapear

Não sei se poderia… acho que como Embeddable object pode… mais ai teria que ser algo assim

[code]<composite-id name=“ItemPedidoPK” class=“entidade.ItemPedidoPK”>

<key-property name=“entidadeNegocioPK” type=“EntidadeNegocioPK” />
<key-property name=“idItem” column=“id_item” type=“java.lang.Integer” />

</composite-id>[/code]

com disse não sei mapear com XML e não gosto dessa abordagem acho annotation muito + elegante… mais facil na manutenção e mais simples

Certo, vou tentar fazer dessa forma.

Estou iniciando em Hibernate, nos exemplos q estudei tem tudo mapeado como XML. Mas vou estudar as tags de configuracao via Annotations.

Valeu pela resposta, assim q eu testar eu dou um feedback

[quote=zap]Certo, vou tentar fazer dessa forma.

Estou iniciando em Hibernate, nos exemplos q estudei tem tudo mapeado como XML. Mas vou estudar as tags de configuracao via Annotations.

Valeu pela resposta, assim q eu testar eu dou um feedback[/quote]

existem ferramentas que podem te ajudar neste trabalho, fazem parte do código, seguem um padrão, o código não fica perfeito mais é um bom começo…
O netbeans tem uma ferramenta propria para fazer mapeamento via annotation, tem ainda a ferramenta do Hibernate Tools integrada que tb faz o mapeamento… No eclipse vc pode baixar o plug-in do Hibernate tools para criar o mapeamento …

Como disse nenhum dessas abordagem fica perfeito para tudo, principalmente para mapeamento complexos de relacionamento, mais é um bom start…

Infelizmente o &lt;key-property name="entidadeNegocioPK" type="EntidadeNegocioPK" /&gt; nao funcionou. Ele reclama que as colunas da tabela nao estao mapeadas:

Initial SessionFactory creation failed org.hibernate.MappingException: Could not determine type for: EntidadeNegocioPK, for columns: [org.hibernate.mapping.Column(entidadeNegocioPK)]

2009-03-25 16:05:41,025ERRORintercommerce.hibernate.HibernatePersistenceManager-&gt;Could not determine type for: EntidadeNegocioPK, for columns: [org.hibernate.mapping.Column(entidadeNegocioPK)]

org.hibernate.MappingException: Could not determine type for: EntidadeNegocioPK, for columns: [org.hibernate.mapping.Column(entidadeNegocioPK)]