Estou tentando desenvolver uma plaicação utilizando JPA e estou com a seguinte dificuldade:
Tenho uma entidade, cuja chave é composta.
Para isso estou utilizando a anotaçao @EmbeddedId.
Até aí tudo bem.
O problema é que cada um dos atributos dessa chave é uma outra entidade.
Com isso, sempre é gerada a segunte exception:
"Entity [class Entidade.UnidadeFuncionario] uses [class Entidade.UnidadeFuncionarioId] as embedded id class whose access-type has been determined as [FIELD]. But [class Entidade.UnidadeFuncionarioId] does not define any [FIELD]. It is likely that you have not provided sufficient metadata in your id class [class Entidade.UnidadeFuncionarioId]."
@EntitypublicclassUnidadeFuncionarioimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@EmbeddedIdprivateUnidadeFuncionarioIdid;privateintpesoUnidade;//getter and setters
@EmbeddablepublicclassUnidadeFuncionarioIdimplementsSerializable{privateFuncionariofuncionario;privateUnidadeunidade;//Getter and setter
Ela deveria conter apenas os valores (campos/atributos) que compõe de fato a chave, não outras entidades.
remarques
Acontece que o que identifica essa classe é exatamente o Indicador e a Unidade. Nesse caso devo usar só o ID?
V
victorpriest
Estou exatamente com o mesmo problema…
Em outro projeto aqui na empresa que usa apenas Hibernate, eu consigo fazer isso, porém no JPA não está dando certo
B
Bruno_Laturner
remarques:
Acontece que o que identifica essa classe é exatamente o Indicador e a Unidade. Nesse caso devo usar só o ID?
Não, o que identifica essa classe são os IDs de funcionario e de unidade, não os próprios funcionários e as unidades. Ou seja, coloque os IDs (Integer, String, o que for) deles lá.
Pode até falar “Mas isso não é muito OO!”
Eu digo “Bem vindo à impendância objeto-relacional!”
Lembre-se que, o que define o comportamento de uma classe são seus métodos, o que é persistido são seus atributos. Ou seja, existem os setters e getters da classe que mapeiam os atributos, mas também existem outros métodos, aqueles que fazem parte da sua lógica de negócio. Ambos os tipos podem estar muito bem na mesma classe.
remarques
Mas se do relacionamento entre tarefa.projeto eu tenho por exemplo um campo data em que a tarefa foi realizada, preciso necessariamente criar uma outra entidade, pra acrescentar esse campo, não é?
E aí nesse caso, se eu precisar de alguma informação da tarefa, por exemplo, vou precisar usar o id para fazer uma consulta, é isso?
V
victorpriest
Desculpe, mas não entendi… vou colocar aqui o que estou tentando fazer:
Aliás, será que não funciona só com @Id em cima de ambos os campos, sem precisar dessa outra classe de PK?
danieldestro
Cara, que complicação você criou. Não confunda-se!
Não é pela chave (PK) que você vai acessar os relacionamentos. A PK serve para definir o identificador do objeto (ID). Os relacionamentos ainda existirão.