Hibernate com anotations. erro "The annotation @OneToOne is disallowed for this location"

Pessoal,
Estou estudando Hibernate com mysql usando anotations e me deparei com um problema básico.
Tenho uma tabela Pessoa, uma Endereco e uma Cep, consigo fazer a ligação de Endereco *-1 Cep e funciona perfeitamente, mas quando tento ligar Pessoa 1-1 Endereco tenho a infeliz mensagem “The annotation @OneToOne is disallowed for this location”.
Tentei simplismente não colocar a anotação em endereço, mas tambem não funcionou.

Grato pela ajuda.
R2.

Em Pessoa.
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name=“numeroEndereco”, referencedColumnName=“numeroEndereco”, nullable=true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.ALL)

Em Endereco.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name=“idcep”, referencedColumnName=“idcep”,insertable=true, updatable=true, nullable=false)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private romulor2.bel.Cep cep; //Publico pois seus gets e sets estao em cep

//Referencias feitas em outras tabelas

@OneToOne(mappedBy=“numeroEndereco”, fetch=FetchType.LAZY) [color=red]//Mensagem de erro aqui.[/color]
@Cascade(CascadeType.ALL) [color=red]//Mensagem de erro aqui.[/color]

Em Cep.
@OneToMany(mappedBy=“idcep”, fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)

Romulo embaixo dessa anotação:

@OneToOne(mappedBy="numeroEndereco", fetch=FetchType.LAZY)  //Mensagem de erro aqui.
@Cascade(CascadeType.ALL) 

Você tem uma variavel de instância para pessoa dessa forma:

@OneToOne(mappedBy="numeroEndereco", fetch=FetchType.LAZY)  //Mensagem de erro aqui.
@Cascade(CascadeType.ALL) 
private Pessoa pessoa;

E em pessoa você tem uma variável de instancia para endereco dessa forma:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="numeroEndereco", referencedColumnName="numeroEndereco", nullable=true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.ALL) 
private Endereco numeroEndereco;

?

Amigao,
Fiz dessa forma:

@Entity
Public Class Pessoa
{
   @id
   protected double numeroPessoa

   ...
 
   @OneToOne(fetch = FetchType.LAZY)
   @JoinColumn(name="numeroEndereco", referencedColumnName="numeroEndereco", nullable=true)
   @Fetch(FetchMode.JOIN)
   @Cascade(CascadeType.ALL) 
   protected romulor2.bel.Endereco endereco;
@Entity
Public Class Endereco
{
   @id
   protected double numeroEndereco
   
   ...

   @ManyToOne(fetch = FetchType.LAZY) 
   @JoinColumn(name="idcep", referencedColumnName="idcep",insertable=true, updatable=true, nullable=false) 
   @Fetch(FetchMode.JOIN) 
   @Cascade(CascadeType.SAVE_UPDATE) 
   private romulor2.bel.Cep cep; //Publico pois seus gets e sets estao em cep
 
   @OneToOne(mappedBy="Endereco", fetch=FetchType.LAZY)  //Mensagem de erro aqui.
   @Cascade(CascadeType.ALL) 

Nao coloquei essa referencia “private Pessoa pessoa” pois endereco nao possui ligacao com pessoa e sim apenas pessoa possui tem ligacao com endereco. [color=red]Deveria ser assim?[/color]
Ainda preciso relacionar a classe Instituicao a Endereco assim como pessoa.

A ideia do estudo e ter uma pessoa que tem um endereco (que contem Cep) ligada a uma instituicao que tambem tem um endereco, assim:

endereco (n-1) cep ----a fk esta em endereco
pessoa (1-1) endereco ----a fk esta em pessoa
instituicao (1-1) endereco ----a fk esta em instituicao
instituicao (1-n) pessoa ----a fk esta em pessoa

Como mysql nao possui FK a minha ideia e fazer isso nas classes.

Obrigado pela ajuda.
Romulo.

Não precisa ser private , o private é apenas para manter uma boa prática de encapsulamento…

Voltando ao seu erro:

Porque você não posta a váriavel que está embaixo da anotação que esta dando problema ? Vou supor que seja a entidade pessoa …

Inicialmente você tinha colocado o mapped by com o nome “numeroEndereco” e agora colocou “Endereco”, esta errado…
O atributo mapped by deve bater exatamente com o nome da variável de instância que está do outro lado do relacionamento…

Apenas como teste, tente fazer o relacionamento entre Pessoa e Endereco dessa forma(mais simples possível):

@Entity  
Public Class Pessoa  
{  
    @Id  
    protected double numeroPessoa

    @OneToOne
    @JoinColumn(name="numeroEndereco")  //Você deve ter uma coluna chamada numeroEndereco na tabela Pessoa, sua FK que no MySql vc representa com um tipo int
    private Endereco endereco;  

}

@Entity  
Public Class Endereco
{  

    @Id  
    protected double numeroEndereco 
     
    @ManyToOne  
    @JoinColumn(name="idcep")
    private Cep cep;

   
    @OneToOne(mappedBy = "endereco") // Atenção aqui , esse nome deve bater com a variável de instância do outro lado do relacionamento
    private Pessoa pessoa;  


}

Remova os imports não mais utilizados e faça o teste novamente…

:oops: Desculpe insistir nisso. :oops:
Mas apenas para entender. Eu não queria colorar uma variavel do tipo Pessoa na classe Endereco, pois na prática não terá utilidade para o meu projeto. Isso é possível?

Não é possível, sua mensagem é clara:

@OneToOne is disallowed for this location

Por isso que insisti para você mostrar quem está embaixo da sua anotação… Obrigatoriamente teria que ser um Field(variável de instância) ou um Método para o Hibernate fazer o mapeamento ORM de forma correta…

Olá, Gente! Estou com um probleminha esquisito aqui. Sou nova nessas coisas de annotations, JPA…etc…

Bem é o seguinte:

Tenho já uma estrutura de pacotes e classes que já funcionam com annotations. Vale ressaltar q qm configurou essas coisas foi uma segunda pessoa que não tarabalha mais comigo :smiley:
Só que agora to tendo que usar uma tabela que não necessariamente deveria ser criada uma classe correspondente, mas na minha primeira tentativa de consulta, já deu erro de mapeamento:

[url]18:01:05,850 WARN [InterceptorRegistry] applicable interceptors is non-existent for public java.util.ArrayList br.org.bolsaTrabalho.controller.OfertaController.buscarOfertabyLocalTrabalho(java.lang.String)
18:01:12,789 ERROR [application] javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: indicefinanceiro is not mapped [select indFin from indicefinanceiro where indFin.titulo like(’%Salário Mínimo Federal%’)]
javax.faces.el.EvaluationException: javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: indicefinanceiro is not mapped [select indFin from indicefinanceiro where indFin.titulo like(’%Salário Mínimo Federal%’)]
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:387)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: indicefinanceiro is not mapped [select indFin from indicefinanceiro where indFin.titulo like(’%Salário Mínimo Federal%’)]
at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77)
at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:159)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:65)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:219)
at org.jboss.ejb3.proxy.handler.ProxyInvocationHandlerBase.invoke(ProxyInvocationHandlerBase.java:261)
at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:101)
at $Proxy190.verificaSalarioMinimo(Unknown Source)
at br.org.bolsaTrabalho.beans.ManterOfertaBean.incluiOferta(ManterOfertaBean.java:432)
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:170)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 36 more

[/url]

Sendo assim, criei uma classe representando a tabela indicefinanceiro, que está da seguinte forma:


import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "indicefinanceiro")
public class IndiceFinanceiro {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "idindicefinanceiro")
	private Integer idIndiceFinanceiro;

	@Column(name = "titulo")
	private String tituloIndice;

	@Column(name = "data_vigencia_inicial")
	private Date dataVigenciaInicial;

	@Column(name = "data_vigencia_final")
	private Date dataVigenciaFinal;

	@Column(name = "valor")
	private Integer valorIndice;

	public Integer getIdIndiceFinanceiro() {
		return idIndiceFinanceiro;
	}

	public void setIdIndiceFinanceiro(Integer idIndiceFinanceiro) {
		this.idIndiceFinanceiro = idIndiceFinanceiro;
	}

	public String getTituloIndice() {
		return tituloIndice;
	}

	public void setTituloIndice(String tituloIndice) {
		this.tituloIndice = tituloIndice;
	}

	public Date getDataVigenciaInicial() {
		return dataVigenciaInicial;
	}

	public void setDataVigenciaInicial(Date dataVigenciaInicial) {
		this.dataVigenciaInicial = dataVigenciaInicial;
	}

	public Date getDataVigenciaFinal() {
		return dataVigenciaFinal;
	}

	public void setDataVigenciaFinal(Date dataVigenciaFinal) {
		this.dataVigenciaFinal = dataVigenciaFinal;
	}

	public Integer getValorIndice() {
		return valorIndice;
	}

	public void setValorIndice(Integer valorIndice) {
		this.valorIndice = valorIndice;
	}

}

daí, no DAO onde preciso usá-la, faço o seguinte:

[code] public Boolean verificaSalarioMinimo(Integer jornadaSemanal, Double salario) {

	Query query = em
			.createQuery("select indFin from indicefinanceiro where indFin.titulo like('%Salário Mínimo Federal%')");
	Object obj = query.getSingleResult();
	Double salarioMinimoFederal = (Double) obj;
	Double salarioMinimoPermitido;

[/code]

Daí, na hora de debugar, qndo ele chega na consulta, repete o mesmo erro apresentado anteriormente.
Por favor, alguém poderia me ajudar? Na minha visão pobre está mapeado corretamente, mas infelizmente ele diz q não.

To usando Eclipse Galileo, JBoss 5.0 e

[quote=Javac]Daí, na hora de debugar, qndo ele chega na consulta, repete o mesmo erro apresentado anteriormente.
Por favor, alguém poderia me ajudar? Na minha visão pobre está mapeado corretamente, mas infelizmente ele diz q não.[/quote]

Seu mapeamento está certo mas seu hql está errado, dê uma revisada nele…

Pois bem… dei uma revisada… realmente esse hql m pega :smiley:

dei uma mudada… no metodo e agora que que a query m retorne o objeto.
Sendo assim, eis a modificação no DAO:

[code]public Boolean verificaSalarioMinimo(Integer jornadaSemanal,
Double salario, IndiceFinanceiro indicefinanceiro) {

	Query query = em
			.createQuery("select ind from indicefinanceiro where ind.id :indicefinanceiro.idindicefinanceiro");
	query.setParameter("idindicefinanceiro", indicefinanceiro.getIdindicefinanceiro());
	Object obj = query.getSingleResult();
	IndiceFinanceiro indiceFinanceiro = (IndiceFinanceiro) obj;
	Double salarioMinimoPermitido;
	Double salarioMinimoFederal = indiceFinanceiro.getValorIndice();[/code]

O problema é que ele agora dá erro de sintaxe! :frowning: Mas este select está exatamente como outro que eu fiz anteriormente, e está exatamente como mapeei na classe.

O que estou errando agora!!! ??? Help!

Descobri meu erro! Lerdeza d minha parte! vlw!!!