Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Herança com JPA

Bom diaa,

Estou com uma dúvida na criação de uma propriedade em uma classe, meu Contrato pode ter mais de um tipo de honorário, porém esses honorários são classes distintas, estrutura :

Honorario - SuperClass
ValorFixo extends Honorario
PercentualFixo extends Honorario
PercentualEscalonado extends Honorario

Como eu crio um atributo dentro do meu contrato que pode comportar um desses honorários ?

Pensei em criar uma factory, porém na hora que starta o Jpa já reclama que minha classe Honorario não é uma entidade, pois esta com a anotação @MappedSuperClass.

10 respostas

Oi Renan tudo bem ?

Como sua classe Honorario esta anotado com @MappedSuperClass, suas classes ValorFixo, PercentualFixo e PercentualEscalonado, deve ser uma Entity (@Entity). Assim seu contrato deve ficar assim:

public class Contrato {

//atributos
...
@OneToOne
private Honorario honorario;
...

Getters and Setters
}

Espero ter ajudado :)

@OneToOne or @ManyToOne on models.Contrato.honorario references an unknown entity: models.Honorario

Me retornou o seguinte erro.

É porque sua classe honorario não é entity (Não tinha me atentado a isso), então você vai ter que mudar um pouco sua modelagem, a classe Honorario deve ser uma Entity, e não ser anotada com MappedSuperClass:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
private abstract class Honorario {

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
... //demais atributos
}

E suas classes filhas devem ficar:

@Entity
public class ValorFixo extends Honorario {
... // atributos (não precisa de id)
}

E a classe contado deve continuar como:

public class Contrato {
//atributos 
...
@OneToOne
private Honorario honorario;
...

Getters and Setters
}

Faz os testes e me retorne um feedback ;)

Acho que estamos chegando lá hahahhaha

Agora o erro me parece ser que ele não consegue criar as chaves primárias nas subclasses

Cannot use identity column key generation with mapping for: models.Honorario

Que banco esta usando? Mysql ?

Sim, MySql.

Tentei mudar para :

@GeneratedValue(strategy = GenerationType.IDENTITY)

e também não foi ://

Cannot use identity column key generation with mapping for: models.Honorario , NOVO ERRO.

solução!

Renan, troque o tipo de herança;

De:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
private abstract class Honorario {

Para:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
private abstract class Honorario {

Amigo, a principio funcionou ! Muito obrigadooo ! Salvou minha vida.

Estou te devendo aquela breja !kkkkkk

Por nada ! Estamos aqui pare te ajudar ;)