Relacionamento CascadeType

Cara o hibernate está reclamando por que você está colocando as anotações diretamente nos atributos, como uma boa prática sempre colocamos as anotações nos getters para não ocorrer quebra de encapsulamento.

@Entity
@Table(name = “setor”)
@Access(AccessType.PROPERTY)
public class Setor{

private Long id;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId(){}

}

Na faculdade e nas vídeo aulas sempre ensinaram da forma que faço. Acho que não é isso, mesmo por que eu mudei agora como falou e gerou:

 Could not determine type for: java.util.list, at table: setor, for column: [org.hibernate.mapping.column(procedimento)]

@Rafael_Blum

Este é outro erro, agora ele está dizendo que não consegue determinar o tipo para java.util.list na tabela setor para a coluna procedimento.

Agora para saber o por que preciso ver as classes modificadas.

Tente fazer o drop das tabelas e deixe o hibernate recria-las sozinho

Eu tinha dropado todas tabelas de setor, procedimento… e dai ele criou tudo certinho, OK.
Entrou no sistema… tela inicial OK
Clico no botão de entrar na tela de cadastro do procedimento e gera erro.

Tenta não criar as listas dentro do objeto, tira o new ArrayList.

Vou tentar… :slight_smile:
Amanhã ajusto e tento e lhe falo brow… to caindo de sono :+1::+1:

Utilizando o select * from procedimento no MySQL, procedimento fica com uma coluna_id, é normal?

E outra coisa,
Fiz desta mesma forma que me falou para um outro relacionamento em meu projeto que é PEDIDO tem muito PRODUTOS (só pedido enxerga os produto).
Confirma tmb, utilizar assim?

Já estou bem confuso nisso?

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = RequisicaoDeCompra.class)
private List<Produto> produtos = new ArrayList<Produto>();

:

@ManyToOne(fetch = FetchType.EAGER, targetEntity = Produto.class)
private List<RequisicaoDeCompra> pedidos = new ArrayList<RequisicaoDeCompra>();

@Rafael_Blum Desculpe a demora em responder, mas como não me marcou não apareceu a notificação para mim.
Explica um pouco melhor, não entendi o problema.

Muitas vezes em um relacionamento de tabelas principalmente no caso de pedidos e produtos é normal o pedido conhecer seus produtos mas os produtos não sabem de qual pedido são, caso queira que o produto guarde o número de id do pedido basta adicionar a anotação JoinColumn ao seu atributo.

Fiz assim e funcionou.
Agora queria saber, cada procedimento fica com uma coluna de setor_id? Ela é obrigatória, porque? É que tenho uma tela que crio o procedimento e nela não quero vincular ao setor, somente quando eu criar o setor e adicionando proced.

E percebi que as vezes temos problemas com a questão do fetch = FetchType.EAGER. Por que queremos listar e tal… vou ter problemas em criar o setor e adicionar o procedimentos?

@Rafael_Blum nesse tipo de relacionamento o banco cria uma terceira tabela, os procedimentos tem de ser vinculados ao setor pelo id, mas quando vc criar um setor você pode ou não informar um procedimento e o mesmo vale pro lado inverso. Tudo fica a critério da sua imaginação na hora de programar.

1 curtida

Na realidade, Villagram, estou utilizando esta mesma dica que me falou na relação de pedido e produto, esta correto da mesma forma né?

Na minha tela quando crio o produto, gera o erro:

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of 
br.com.project.model.classes.RequisicaoDeCompra.id

Ele está reclamando que está anotando o campo ao em vez do getter, ou esquecendo de colocar o @Access

Erro:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: requisicaoDeCompra, for columns: [org.hibernate.mapping.Column(produtos)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290)
at org.hibernate.mapping.Property.isValid(Property.java:217)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464)
at org.hibernate.mapping.RootClass.validate(RootClass.java:235)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
at br.com.framework.hibernate.session.HibernateUtil.buildSessionFactory(HibernateUtil.java:38)
at br.com.framework.hibernate.session.HibernateUtil.<clinit>(HibernateUtil.java:30)
at br.com.project.filter.FilterOpenSessionInView.initFilterBean(FilterOpenSessionInView.java:43)
at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:179)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4699)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5339)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
  abr 29, 2018 10:54:05 PM org.apache.catalina.core.StandardContext filterStart
  GRAVE: Exception starting filter conexaoFilter
    java.lang.ExceptionInInitializerError: ERRO AO CRIAR A CONEXÃO SESSIONFACTORY!!
at 
    br.com.framework.hibernate.session.HibernateUtil.buildSessionFactory(HibernateUtil.java:44)
at br.com.framework.hibernate.session.HibernateUtil.<clinit>(HibernateUtil.java:30)
at 
   br.com.project.filter.FilterOpenSessionInView.initFilterBean(FilterOpenSessionInView.java:43)
at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:179)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4699)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5339)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

  abr 29, 2018 10:54:05 PM org.apache.catalina.core.StandardContext startInternal
   GRAVE: One or more Filters failed to start. Full details will be found in the appropriate container 
    log file
      abr 29, 2018 10:54:05 PM org.apache.catalina.core.StandardContext startInternal
     GRAVE: Context [/ger-industrialatividadesdynamico] startup failed due to previous errors
    abr 29, 2018 10:54:05 PM org.apache.catalina.core.ApplicationContext log
    INFORMAÇÕES: Closing Spring root WebApplicationContext
    6439 [localhost-startStop-1] INFO                                                         
    org.springframework.web.context.support.XmlWebApplicationContext - Closing Root         
     WebApplicationContext: startup date [Sun Apr 29 22:53:58 BRT 2018]; root of context 
       hierarchy
     6439 [localhost-startStop-1] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@68f83aa8: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0,org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0,org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0,org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#1,contaRazaoController,documentoController,entidadeController,fornecedorController,procedimentoController,produtoController,requisicaoController,setorController,srvContaRazaoImpl,srvDocumentoImpl,srvEntida

Não tem uma forma mais fácil de fazer este relacionamento?

Cara o problema não é a anotação do id, agora o problema é esse new ArrayList() o hibernate não aceita isto.

Mas eu uso no projeto relacionamentos com List e utilizo new ArrayList e funciona normal.

O que me sugere?

Desculpa lhe atrapalhar ai brow.

Dentro da classe de objeto não inicialize a lista, faça isso onde você instancia ela ou no construtor dela.

1 curtida

Funcionou mesmo.

Você quer me dizer que agora eu inicializo a List na RequisicaoBean para ir adicionando os produtos?

E me diz, vou adicionando os produtos e automaticamente a coluna com id da requisicao em produto ficara com id da requisicao? Isso?