1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problemas com relacionamento de entidades com JPA

Criei um projeto usando Maven + JSF2.2 + CDI + JPA, e implementei um CRUD da tabela imovel, porém essa tabela imóvel tem relacionamento com duas outras tabelas que intitulei como categoria de modelo e categoria de cidade, está funcionando perfeitamente, como já tinha criado o CRUD da tabela imovel fui para a próxima etapa do meu projeto que é criar um CRUD da tabela cidade, estava aparentando tudo certo quando resolvi fazer um teste inserindo um registro na tabela cidade utilizando o sistema, e gerou um erro.

Hibernate: select cidade0_.cidadeId as cidadeId1_0_, cidade0_.cidade_pai_id as cidade3_0_, cidade0_.descCidade as descCida2_0_ from Cidade cidade0_ where cidade0_.cidade_pai_id is null
Hibernate: select modelo0_.modeloId as modeloId1_2_, modelo0_.descModelo as descMode2_2_, modelo0_.modelo_pai_id as modelo3_2_ from Modelo modelo0_ where modelo0_.modelo_pai_id is null
set 29, 2015 7:48:30 AM com.sun.faces.lifecycle.InvokeApplicationPhase execute
ADVERTÊNCIA: #{cadastroImovelBean.salvar}: javax.validation.ConstraintViolationException: Validation failed for classes [br.com.terezinha.adm.model.Imovel] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=valorImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=cidade, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=descImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=modelo, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=nomeImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
javax.faces.FacesException: #{cadastroImovelBean.salvar}: javax.validation.ConstraintViolationException: Validation failed for classes [br.com.terezinha.adm.model.Imovel] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=valorImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=cidade, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=descImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=modelo, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=nomeImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: javax.validation.ConstraintViolationException: Validation failed for classes [br.com.terezinha.adm.model.Imovel] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=valorImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=cidade, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=descImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=modelo, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=nomeImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
    ... 28 more
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [br.com.terezinha.adm.model.Imovel] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=valorImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=cidade, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=descImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=modelo, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='deve ser informado', propertyPath=nomeImovel, rootBeanClass=class br.com.terezinha.adm.model.Imovel, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:159)
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94)
    at org.hibernate.action.internal.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:178)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:75)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:71)
    at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:236)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:216)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:914)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:898)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:902)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:889)
    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.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:45)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
    at org.jboss.weld.proxies.EntityManager$2139659341$Proxy$_$$_WeldClientProxy.merge(EntityManager$2139659341$Proxy$_$$_WeldClientProxy.java)
    at br.com.terezinha.adm.repository.Imoveis.guardar(Imoveis.java:18)
    at br.com.terezinha.adm.service.CadastroImovelService.salvar(CadastroImovelService.java:23)
    at br.com.terezinha.adm.service.CadastroImovelService$Proxy$_$$_WeldSubclass.salvar(CadastroImovelService$Proxy$_$$_WeldSubclass.java)
    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.weld.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:85)
    at org.jboss.weld.interceptor.proxy.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:127)
    at br.com.terezinha.adm.util.cdi.jpa.TransactionInterceptor.invoke(TransactionInterceptor.java:38)
    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.weld.interceptor.proxy.SimpleMethodInvocation.invoke(SimpleMethodInvocation.java:30)
    at org.jboss.weld.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:69)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:112)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:88)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:55)
    at br.com.terezinha.adm.service.CadastroImovelService$Proxy$_$$_WeldSubclass.salvar(CadastroImovelService$Proxy$_$$_WeldSubclass.java)
    at br.com.terezinha.adm.controller.CadastroImovelBean.salvar(CadastroImovelBean.java:71)
    at br.com.terezinha.adm.controller.CadastroImovelBean$Proxy$_$$_WeldClientProxy.salvar(CadastroImovelBean$Proxy$_$$_WeldClientProxy.java)
    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.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 29 more

Eu até entendi o erro;

A mensagem de erro informa que não posso inserir um registro da tabela cidade sem antes inserir um registro da tabela imovel, mas a tabela cidade tem relacionamento independente, e tanto que consigo incluir pelo próprio banco de dados utilizando SQL.

aqui abaixo está meu banco;

https://www.filepicker.io/api/file/mpjixoicR0epWlLGxU75

Eu acredito que o problema esteja no mapeamento que fiz das tabelas, ou do relacionamento que fiz utilizando o JPA;

@Id
@GeneratedValue
private Long imovelId;

@NotBlank
@Column(length = 60, nullable = false)
private String nomeImovel;

@NotBlank
@Column(length = 255, nullable = false)
private String descImovel;


private String imagem;

@NotNull
@Column(precision = 10, scale = 2, nullable = false)
private BigDecimal valorImovel;

@NotNull
@ManyToOne
@JoinColumn(name = "modeloId", nullable = false)
private Modelo modelo;

@NotNull
@ManyToOne
@JoinColumn(name = "cidadeId", nullable = false)
private Cidade cidade;

Entidade cidade;

    @Id
    @GeneratedValue
    private Long cidadeId;

    @NotBlank
    @Column(length = 60, nullable = false)
    private String descCidade;

    @ManyToOne
    @JoinColumn(name = "cidade_pai_id")
    private Cidade cidadePai;


    @OneToMany(mappedBy = "cidadePai", cascade = CascadeType.ALL)
    private List<Cidade> subCidades = new ArrayList<>();

entidade modelo;

@Id
@GeneratedValue
private Long modeloId;

@Column(length = 60, nullable = false)
private String descModelo;

@ManyToOne
@JoinColumn(name = "modelo_pai_id")
private Modelo modeloPai;

@OneToMany(mappedBy = "modeloPai", cascade = CascadeType.ALL)
private List<Modelo> subModelos = new ArrayList<>();

Eu utilizei JPQL para inserir a tabela cidade como fiz na tabela imovel

public Cidade guardar(Cidade cidade) {
    return manager.merge(cidade);
}

OBS: na pagina para inserir cidade eu insiro somente a descCidade.

preciso de ajuda, se for possível deixo disponível o código no GitHub.

https://github.com/wladimirbandeira/Terezinha.Adm/blob/master/Terezinha.Adm/src/main/webapp/cidade/CadastroCidade.xhtml

  • Publica a classe modelo por favor...

    Maike Meneguetti   29 de set de 2015
  • acabei de atualizar a postagem

    wladyband   29 de set de 2015
  • Disponibiliza o código para que possa analisar...

    Maike Meneguetti   29 de set de 2015
  • acabei de colocar o caminho do meu repositório.

    wladyband   29 de set de 2015
  • Você disse que tentou fazer o Cadastro de Cidade, mas no código do GitHub não tem nada Relacionado com Cidade.

    Maike Meneguetti   29 de set de 2015
Mostrar todos os 7 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa jsf ou faça a sua própria pergunta.