JoinTable com chave composta usando hibernate

3 respostas
drcosta

Bom dia!

Pessoal, preciso muito de ajuda. Já estou tentando resolver esse problema há 3 dias.

Estou com problema ao executar minha aplicação com o hibernate 3.2. Fiz um teste com o eclipselink e funciona, mas preciso fazer funcionar no hibernate.

Tenho as seguintes tabelas:

CREATE TABLE IntProPromocao
idProcesso NUMERIC(10) NOT NULL,
codOperacao CHAR(1) COLLATE Latin1_General_CI_AS NOT NULL,
codPromocao NUMERIC(10) NOT NULL,
codTipoPromocao NUMERIC(3) NOT NULL,
descPromocao VARCHAR(40) COLLATE Latin1_General_CI_AS NULL,
dataInicio DATETIME NULL,
dataFim DATETIME NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[IntProPromocao] WITH NOCHECK ADD
CONSTRAINT [PK_IntProPromocao] PRIMARY KEY CLUSTERED
(
[idProcesso],[codOperacao],[codPromocao]
) ON [PRIMARY]


CREATE TABLE IntProCategoriaCliente (
idProcesso NUMERIC(10) NOT NULL,
codOperacao CHAR(1)COLLATE Latin1_General_CI_AS NOT NULL,
codCategoria NUMERIC(10) NOT NULL,
descCategoria VARCHAR(20) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[IntProCategoriaCliente] WITH NOCHECK ADD
CONSTRAINT [PK_IntProCategoriaCliente] PRIMARY KEY CLUSTERED
(
[idProcesso],[codOperacao],[codCategoria]
) ON [PRIMARY]


CREATE TABLE IntProPromocaoCategoria (
idProcesso NUMERIC(10) NOT NULL,
codOperacao CHAR(1) COLLATE Latin1_General_CI_AS NOT NULL,
codCategoria NUMERIC(10) NOT NULL,
codPromocao NUMERIC(10) NOT NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[IntProPromocaoCategoria] WITH NOCHECK ADD
CONSTRAINT [PK_IntProPromocaoCategoria] PRIMARY KEY CLUSTERED
(
[idProcesso],[codOperacao],[codPromocao],[codCategoria]
) ON [PRIMARY]

ALTER TABLE [dbo].[IntProPromocaoCategoria] ADD CONSTRAINT FK_IntProPromocaoCategoria_1
FOREIGN KEY (idProcesso, codOperacao, codPromocao)
REFERENCES IntProPromocao (idProcesso, codOperacao, codPromocao)
ON DELETE CASCADE
ON UPDATE CASCADE

ALTER TABLE [dbo].[IntProPromocaoCategoria] ADD CONSTRAINT FK_IntProPromocaoCategoria_2
FOREIGN KEY (idProcesso, codOperacao, codCategoria)
REFERENCES IntProCategoriaCliente(idProcesso, codOperacao, codCategoria)
ON DELETE CASCADE
ON UPDATE CASCADE

Estou usando JPA pra fazer o mapeamento usando @JoinTable. Fiz da seguinte maneira:

Classe Promocao.java

@ManyToMany
@JoinTable(name="IntProPromocaoCategoria",
		joinColumns={
			@JoinColumn(name="idProcesso", referencedColumnName="idProcesso", insertable=false, updatable=false),
			@JoinColumn(name="codOperacao", referencedColumnName="codOperacao", insertable=false, updatable=false),
			@JoinColumn(name="codPromocao", referencedColumnName="codPromocao", insertable=false, updatable=false)
		},
		inverseJoinColumns={
			@JoinColumn(name="idProcesso", referencedColumnName="idProcesso", insertable=false, updatable=false),
			@JoinColumn(name="codOperacao", referencedColumnName="codOperacao", insertable=false, updatable=false),
			@JoinColumn(name="codCategoria", referencedColumnName="codCategoria", insertable=false, updatable=false)
		})	
private List<CategoriaCliente> categorias;

Com esse mapeamento dá o seguinte erro:

javax.persistence.PersistenceException: org.hibernate.MappingException: Repeated column in mapping for collection: com.itautec.siac.integracao.promocao.entidade.Promocao.categorias column: idProcesso

at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698)

at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:127)

at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:264)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.jboss.ejb3.ServiceDelegateWrapper.startService(ServiceDelegateWrapper.java:102)

O problema é que a tabela de associação IntProPromocaoCategoria usa 2 campos (o mesmo) de associação para as tabelas IntProPromocao e para a IntProCategoriaCliente, dando coluna duplicada.

Já fiz engenharia reversa criando as classes a partir do banco de dados e ele cria exatamente dessa maneira. Não consigo achar o problema. Se alguém puder me ajudar ficarei muito grato!

Abs,

Daniel

3 Respostas

Hebert_Coelho

Faz o seguinte então, apaga as tabelas (ou usa um schema zerado) e coloca o hibernate para criar as tabelas para você. [=

drcosta

Como faço o hibernate criar as tabelas pra mim?

O problema não me parece nas tabelas, mas com o campo idProcesso da tabela IntProPromocaoCategoriaCliente que tem uma forenkey pra IntProCategoriaCliente e outra para IntProPromocao.

Obrigado pelo retorno.

Abs,

Daniel

Hebert_Coelho

Coloca essa linha no seu arquivo de propriedades:

No caso de JPA puro é desse modo, para hibernate você coloca esses valores lá no formato do próprio aruqivo.

Criado 9 de novembro de 2011
Ultima resposta 9 de nov. de 2011
Respostas 3
Participantes 2