[Resolvido] Dúvida FOREACH usando Hibernate e V-Raptor

Bom, parece estar tudo correto. Na classe Cliente tá assim:

@Id @GeneratedValue @Column(name = "CL_COD_CLIENTE", nullable = false) public int getCod_cliente() { return cod_cliente; } @OneToMany(targetEntity=Orcamento.class ,cascade = CascadeType.ALL, mappedBy = "cliente") public List<Orcamento> orcamentos;
Na tabela o nome da coluna é CL_COD_CLIENTE.
Na classe Orcamento tá assim:

[code]@Id
@GeneratedValue
@Column(name = “OR_COD_ORCAMENTO”)
public int getCod_orcamento() {
return cod_orcamento;
}

public void setCod_orcamento(int codOrcamento) {
    cod_orcamento = codOrcamento;
}
@ManyToOne
private Cliente cliente;

@Column(name = "OR_COD_CLIENTE", nullable = false)
public int getCod_cliente() {
    return cod_cliente;
}[/code]

O nome da coluna do código do Cliente na tabela Orçamento é OR_COD_CLIENTE. Aparentemente tá certo.

Consegui fazer funcionar mas alterei minha DAO para:

public List<Orcamento> lista() { Criteria crit = session.createCriteria(Orcamento.class); crit.add(Restrictions.eq("cod_orcamento", new Integer(11))); return crit.list(); }
Ou seja, removi o createAlias, mas não consegui descobrir o porque de não funcionar com o createAlias.

O alias só vai funcionar se o atributo que vc esta buscando existir na classe Cliente:

public List<Orcamento> lista() {
        Criteria crit = session.createCriteria(Orcamento.class).createAlias("cliente", "c");
        crit.add(Restrictions.eq("c.cod_orcamento", new Integer(11)));
        return crit.list();
    }

No exemplo anterior, estava pegando o cod_orcamento na classe Cliente, se cod_orcamento não existir vc busca pelo que existir lá.
Sem o alias funciona pq cod_orcamento esta na própria classe Orcamento, funcionou pq existe orçamento com código 11, se vc quiser pegar todos os orçamentos de um determinado cliente vc terá que passar o código do cliente por parâmetro para a Criteria encontrar e não dessa forma que vc está fazendo.

Olha que estranho, fiz essa Criteria:

public List<Orcamento> lista() { System.out.println("Dao"); Criteria crit = session.createCriteria(Orcamento.class); crit = crit.createCriteria("cliente"); crit.add(Restrictions.eq("cod_cliente", 11)); return crit.list(); }
Mandei buscar os Orçamentos do cliente de código 11, na minha tabela Orcamento existe a coluna cod_cliente. O mapeamento tá assim:

[code]@ManyToOne()
public Cliente cliente;

@Column(name = "OR_COD_CLIENTE", nullable = false)
public int getCod_cliente() {
    return cod_cliente;
}[/code]

Ao tentar executar a criteria ainda persiste o erro:

org.hibernate.QueryException: could not resolve property: cliente of: br.bmweb.bean.Orcamento org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67) org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61) org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1385)
Ele não tá encontrando a propriedade cliente na classe Orcamento, do meu ponto de vista está tudo certo, pra montar a Criteria segui este tópico implementando o exemplo que o Paulo Silveira postou http://www.guj.com.br/posts/list/41523.java, deveria funcionar a Criteria não deveria?

Experimenta colocar as anotações em cima dos atributos e não em cima dos gets.

Também não foi, o jeito é eu fechar esse tópico aqui e abrir um lá na parte de persistência pra ver se o pessoal tem idéia.

Mas vc não viu e nem postou a JSP com o Controller, como alguém vai adivinhar exatamente onde está o erro? Se vc postar lá e não mostrar o código ninguém vai adivinhar, além do mais, postar seu projeto war e esperar que alguém venha baixar e resolver pra vc fica inviável.

Ok, não tinha postado o Controller porque o erro ocorre justamente na Criteria que está na DAO, então o JSP nem chega a ser processado e mostrado, se acesso a URL já vai direto para o erro, meu objetivo desde o início é fazer um SELECT que irá trazer uma lista de dados da tabela, estou tentando fazer esta Criteria simples entre tabela Cliente e Orcamento para depois montar a verdadeira Criteria que vou usar, a qual irá possuir relacionamento com 3 tabelas, seguem o meu Controller, DAO, JSP e classes mapeadas, vou postar apenas a parte de interessa do código:

ConsultorController:

public List<Orcamento> Orcamentos(){ return orcamentodao.lista(); }
OrcamentoDao:

public List<Orcamento> lista() { Criteria crit = session.createCriteria(Orcamento.class); crit = crit.createCriteria("cliente"); crit.add(Restrictions.eq("cod_cliente", 11)); return crit.list(); }
Orcamentos.jsp:

<table width="763"> <c:forEach items="${orcamentoList}" var="orcamento"> <tr> <td> <input name="a" type="text" id="cod_orcamento" value="${orcamento.cod_orcamento}" /> </td> </tr> </c:forEach> </table>
Cliente:

[code]@Id
@GeneratedValue
@Column(name = “CL_COD_CLIENTE”, nullable = false)
public int getCod_cliente() {
return cod_cliente;
}

public void setCod_cliente(int codCliente) {
    cod_cliente = codCliente;
}
@OneToMany(targetEntity=Orcamento.class ,cascade = CascadeType.ALL, mappedBy = "cliente")
public List<Orcamento> orcamento;
//...outros atributos...[/code]

Orcamento:

[code]@Id
@GeneratedValue
@Column(name = “OR_COD_ORCAMENTO”)
public int getCod_orcamento() {
return cod_orcamento;
}

public void setCod_orcamento(int codOrcamento) {
    cod_orcamento = codOrcamento;
}
@ManyToOne
@Fetch(FetchMode.JOIN)
private Cliente cliente;[/code]

O erro completo que ocorre é este:

[code]br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause

org.hibernate.QueryException: could not resolve property: cliente of: br.bmweb.bean.Orcamento
org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1385)
org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:227)
org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:214)
org.hibernate.loader.criteria.CriteriaQueryTranslator.(CriteriaQueryTranslator.java:104)
org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:82)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1577)
org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
org.hibernate.impl.CriteriaImpl$Subcriteria.list(CriteriaImpl.java:481)
br.bmweb.dao.OrcamentoDao.lista(OrcamentoDao.java:100)
br.bmweb.controller.ConsultorController.Orcamentos(ConsultorController.java:682)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)[/code]
Linha 682 da ConsultorController: return orcamentodao.lista();
Linha 100 da OrcamentoDao: return crit.list();
Stacktrace:

18:19:47,111 DEBUG [VRaptor ] VRaptor received a new request 18:19:47,259 DEBUG [DefaultRequestExecution] executing stack DefaultRequestExecution 18:19:47,373 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 18:19:47,374 DEBUG [DefaultResourceTranslator] trying to access / 18:19:47,445 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: IndexController.indexIndexController.index()] 18:19:47,490 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor 18:19:47,501 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor 18:19:47,515 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor 18:19:47,698 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 18:19:47,705 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 18:19:47,706 DEBUG [AsmBasedTypeCreator ] Trying to make class for IndexController$index$715134878$1 18:19:47,743 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for IndexController.index() as [] 18:19:47,743 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [] 18:19:47,744 DEBUG [AsmBasedTypeCreator ] Methods: [] 18:19:47,744 DEBUG [AsmBasedTypeCreator ] Fields: [] 18:19:47,744 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: IndexController.indexIndexController.index()] 18:19:47,771 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for IndexController.index() as [] 18:19:47,829 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: IndexController.indexIndexController.index()] are [] 18:19:48,052 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor 18:19:48,052 DEBUG [ExecuteMethodInterceptor] Invoking IndexController.index() 18:19:48,068 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult 18:19:48,087 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor 18:19:48,087 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic 18:19:48,117 DEBUG [DefaultPageResult ] forwarding to /WEB-INF/jsp/index/index.jsp 18:19:48,157 DEBUG [DefaultStaticContentHandler] Deferring request to container: /BMWEB/WEB-INF/jsp/index/index.jsp 18:19:48,394 DEBUG [VRaptor ] VRaptor ended the request 18:19:56,090 DEBUG [VRaptor ] VRaptor received a new request 18:19:56,091 DEBUG [DefaultRequestExecution] executing stack DefaultRequestExecution 18:19:56,095 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 18:19:56,096 DEBUG [DefaultResourceTranslator] trying to access /consultor/Orcamentos 18:19:56,097 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ConsultorController.OrcamentosConsultorController.Orcamentos()] 18:19:56,103 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor 18:19:56,108 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor 18:19:56,177 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. 18:19:58,719 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 18:19:58,719 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 18:19:58,719 DEBUG [AsmBasedTypeCreator ] Trying to make class for ConsultorController$Orcamentos$423645247$2 18:19:58,719 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ConsultorController.Orcamentos() as [] 18:19:58,719 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [] 18:19:58,778 DEBUG [AsmBasedTypeCreator ] Methods: [] 18:19:58,778 DEBUG [AsmBasedTypeCreator ] Fields: [] 18:19:58,778 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: ConsultorController.OrcamentosConsultorController.Orcamentos()] 18:19:58,779 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ConsultorController.Orcamentos() as [] 18:19:58,779 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ConsultorController.OrcamentosConsultorController.Orcamentos()] are [] 18:19:58,895 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor 18:19:58,895 DEBUG [ExecuteMethodInterceptor] Invoking ConsultorController.Orcamentos()

Encontrei a solução para meu problema, o erro estava nos mapeamentos, um amigo me deu a dica de criar uma projeto JPA no Eclipse para gerar os mapeamentos, segui a dica e ficou assim:
Orcamento:

[code]@Entity
@Table(name = “tb_orcamento”)
public class Orcamento implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "OR_COD_ORCAMENTO")
private int cod_orcamento;
@Column(name = "OR_COD_FUNCIONARIO")
private int cod_funcionario;
@Temporal(TemporalType.DATE)
@Column(name = "OR_DATA_ALTERACAO")
private Date data_alteracao;
@Temporal(TemporalType.DATE)
@Column(name = "OR_DATA_FECHAMENTO")
private Date data_fechamento;
@Temporal(TemporalType.DATE)
@Column(name = "OR_DATA_ORCAMENTO")
private Date data_orcamento;
@Temporal(TemporalType.DATE)
@Column(name = "OR_DATA_VALIDADE")
private Date data_validade;
@Column(name = "OR_STATUS_ORCAMENTO")
private String status_orcamento;
@Column(name = "OR_TIPO_ORCAMENTO")
private String tipo_orcamento;
@Column(name = "OR_VALOR_TOTAL")
private float valor_total;
//bi-directional many-to-one association to ItemOrcamento
@OneToMany(mappedBy = "Orcamento")
private Set<ItemOrcamento> ItemOrcamentos;
//bi-directional many-to-one association to Cliente
@ManyToOne
@JoinColumn(name = "OR_COD_CLIENTE")
private Cliente Cliente;
//bi-directional many-to-one association to Venda
@OneToMany(mappedBy = "Orcamento")
private Set<Venda> Venda;

public Orcamento() {
}    
 /...gets e sets[/code]

Cliente:

[code]@Entity
@Table(name = “tb_cliente”)
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CL_COD_CLIENTE")
private int cod_cliente;
@Column(name = "CL_BAIRRO")
private String bairro;
@Column(name = "CL_CEP")
private String cep;
@Column(name = "CL_CIDADE")
private String cidade;
@Column(name = "CL_CNPJ")
private String cnpj;
@Column(name = "CL_COMPLEMENTO")
private String complemento;
@Column(name = "CL_CONTATO")
private String contato;
@Column(name = "CL_CPF")
private String cpf;
@Temporal(TemporalType.DATE)
@Column(name = "CL_DATA_CADASTRO")
private Date data_cadastro;
@Temporal(TemporalType.DATE)
@Column(name = "CL_DATA_NASCIMENTO")
private Date data_nascimento;
@Column(name = "CL_DDD_CELULAR")
private String ddd_celular;
@Column(name = "CL_DDD_COMERCIAL")
private String ddd_comercial;
@Column(name = "CL_DDD_RESIDENCIAL")
private String ddd_residencial;
@Column(name = "CL_EMAIL")
private String email;
@Column(name = "CL_ESTADO")
private String estado;
@Column(name = "CL_FONE_CELULAR")
private String fone_celular;
@Column(name = "CL_FONE_COMERCIAL")
private String fone_comercial;
@Column(name = "CL_FONE_RESIDENCIAL")
private String fone_residencial;
@Column(name = "CL_LOGRADOURO")
private String logradouro;
@Column(name = "CL_MERCADO")
private String mercado;
@Column(name = "CL_NEWS_LETTER")
private String newsletter;
@Column(name = "CL_NOME")
private String nome;
@Column(name = "CL_NUMERO")
private String numero;
@Column(name = "CL_PLACA")
private String placa;
@Column(name = "CL_PROFISSAO")
private String profissao;
@Column(name = "CL_RAMAL_COMERCIAL")
private String ramal_comercial;
@Column(name = "CL_RG")
private String rg;
@Column(name = "CL_TIPO_CLIENTE")
private String tipo_cliente;
@Column(name = "CL_TIPO_ENDERECO")
private String tipo_endereco;
@Column(name = "CL_TITULO_LOGRADOURO")
private String titulo_logradouro;
//bi-directional many-to-one association to Orcamento
@OneToMany(mappedBy = "Cliente")
private Set<Orcamento> Orcamento;
//bi-directional many-to-one association to Venda
@OneToMany(mappedBy = "Cliente")
private Set<Venda> Vendas;

public Cliente() {
}[/code]

DAO:

public List<Orcamento> lista() { Criteria crit = session.createCriteria(Orcamento.class); crit.add(Restrictions.eq("cod_orcamento", 10)); crit = crit.createCriteria("ItemOrcamentos"); crit = crit.createCriteria("Produto"); return crit.list(); }
Meus erros eram:

  1. Nos mapeamentos do tipo OneToMany declarar a propriedade mappedBy e ao declarar a entidade usar o Set, ou seja, algo como por exemplo: private Set<ItemOrcamento> ItemOrcamentos;
  2. Nos relacionamentos ManyToOne utilizar a propriedade JoinColumn e não há necessidade de usar o Set ao declarar a entidade do relacionamento.
  3. Sempre declarar o @Column nos próprios atributos da classe e não gets como eu estava fazendo.
    Guevara muito obrigado pelas dicas.
    Lucas obrigado pela indicação da apostila e eu já estava seguindo ela :slight_smile: