Como mapear no JPA TABLE_PER_CLASS herança para [columns] e [sequences] diferentes?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

Olá, estou tendo dificuldade em fazer o seguinte mapeamento, onde tenho uma tabela por subclasse, usando JPA 2. Segue classe abstrata(superclasse) abaixo:
e na subclasse:
no caso o atributo id é compartilhado entre as subclasses, e estas tem chave primárias diferentes, e consequente nome se sequences diferentes.
do jeito que está acima, ganho o seguinte erro:
org.springframework.dao.InvalidDataAccessResourceUsageException:
could not get next sequence value; SQL [select nextval ('hibernate_sequence')];
nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value

alguém saberia como resolver mapeando a partir da subclasse?

This message was edited 1 time. Last update was at 11/05/2010 15:49:04



--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

tinha visto algumas abordagens que mapeia a superclasse com @MappedSuperclass, onde na classe FieldDefinition ao invés de usar @Entity, usar @MappedSuperclass, mas isso implicará no seguinte erro abaixo, pois eu tenho outra classe, que tem um relacionamento @OneToMany para FieldDefinition

classe InfoRequest, que tem relacionamento OneToMany com FieldDefinition(abstrata)

erro ao tentar modificar classe FieldDefinition, usando @MappedSuperclass, ao invés de @Entity

resumindo, apenas estou realçando o porque não usei @MappedSuperclass para mapear a superclasse, FieldDefinition, apesar de este não ser o erro em específico, permanecendo o primeiro acima.

This message was edited 1 time. Last update was at 11/05/2010 17:56:15



--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
oddy.silva
JavaEvangelist
[Avatar]

Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline

Lá no seu Set<T>, você pode mapear com @CollectionOfElements.





Tenta aí

This message was edited 2 times. Last update was at 11/05/2010 16:05:39


Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"

Quer ser um programador veloz? Então compre um par de tênis a jato.
[Email]
pinheiro.cc
Entusiasta Java

Membro desde: 17/11/2008 10:30:43
Mensagens: 24
Localização: Jaboticabal / Ribeirão Preto
Offline

eu acredito que não exista a necessidade de mapear novamente isso



na classe IntegerField
-----

caso você esteja com problema com o atributo ID ser utilizado em várias tabelas, você pode utilizar um @TableGenerator que controla e distribui os ID para todas as tabelas que extendem essa classe.

você ja tentou isso?
[MSN]
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

oddy.silva wrote:Lá no seu Set<T>, você pode mapear com @CollectionOfElements.
Tenta aí

entendi, mas eu não poderia utilizar CollectionOfElements, porque a classe FieldDefinition é uma classe abstrata que não está mapeada para uma tabela.


pinheiro.cc wrote:eu acredito que não exista a necessidade de mapear novamente isso
na classe IntegerField

é vero, efeito copy-paste aqui no tópico. ignorem!


pinheiro.cc wrote:caso você esteja com problema com o atributo ID ser utilizado em várias tabelas, você pode utilizar um @TableGenerator que controla e distribui os ID para todas as tabelas que extendem essa classe. você ja tentou isso?

não tentei porque inicialmente não tinha achado que se aplicava ao meu caso por conta das sequences serem diferentes.


--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

para explicar melhor o caso tenho o seguinte cenário no modelo de classe e banco, respectivamente


obs: analisando a priori estes modelos individualmente, parece uma idéia inútil, mas removi bastantes informações afim de facilitar entendimento, como idéia básica para mapear estes relacionamentos.

This message was edited 2 times. Last update was at 11/05/2010 17:04:06



--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

fazendo uns testes a força bruta, resgistrando tentativa falha, ele gerou o seguinte jpql
Hibernate: insert into owners (logo_id, name) values (?, ?)
Hibernate: select currval('owners_owner_id_seq')
Hibernate: insert into info_requesters (final_date, owner_id) values (?, ?)
Hibernate: select currval('info_requesters_info_request_id_seq')
Hibernate: select nextval ('integer_fields_integer_field_id_seq')
Hibernate: insert into integer_fields (label, required, info_request_id, integer_field_id) values (?, ?, ?, ?)
Hibernate: update FieldDefinition set info_request_id=? where integer_field_id=?

reparem que na última linha ele gerou uma operação de update para classe abstrata onde não deveria, apesar de na linha anterior ter feito um insert na tabela correta mapeada a partir da subclasse. segue como ficou mapeamento para gerar comportamento acima:

classe abstrata FieldDefinition ... Fiz propositalmente declaração dos campos na superclasse, pois não consegui rescrevê-los na subclasse demonstrado no 1º post deste tópico


subclasse IntegerField


classe InfoRequest que possui relacionamento OneToMany com classe abstrata FieldDefinition, do tipo Set<FieldDefinition>


segue abaixo como ficou chamada para metodo de teste do log acima identificado na geração do hql


erro ocorre após executar linha de método acima sync()
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 update FieldDefinition set info_request_id=107 where integer_field_id=1700 foi abortada. Chame getNextException para ver a causa. ERRO: relação "fielddefinition" não existe

obs: último acima informa uma coisa óbvia, faltando apenas fazer com que ele gere jpql para entidade certa.

This message was edited 2 times. Last update was at 12/05/2010 10:27:32



--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

uma pergunta vocês sabem como faço para sobrescrever mapeamento da chave primária a partir da subclasse. não é sobrescrever associação ou atributo, é o @Id da superclasse.
no caso tentei fazê-lo da seguinte forma:

super classe FieldDefinition

subclasse IntegerField

fazendo isto recebo a seguinte exceção
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass

vi no forum do hibernate sobre onde uma alternativa seria, tipo colocando uma anotação no método get, mas não funfou/funcionou

This message was edited 1 time. Last update was at 13/05/2010 18:09:42



--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team