Hibernate: como configuro uma foreign key

Olá!
Esta é uma dúvida primaria, mas não estou conseguindo colocar para funcionar.
Dadas as classes:

@Entity
public class Sala implements Serializable{
	@EmbeddedId
	private SalaPK id;
	@Column(name="codsala",insertable=false,updatable=false)
	private String codSala;
	@Column(name="capacidade")
	private int capacidade;
	@Column(name="arcondicionado")
	private int arCondicionado;
	@Column(name="ventilador")
	private int ventilador;
	@Column(name="ativo")
	private String ativo;
	@Column(name="dscsala")
	@OrderBy
	private String dscSala;
	@Column(name="tipoquadro")
	private String tipoQuadro;
	@Column(name="datashow")
	private String dataShow;
	
	@Column(name="codtiposala")
	private int codTipoSala;
	
	public int getCodTipoSala() {
		return codTipoSala;
	}
	public void setCodTipoSala(int codTipoSala) {
		this.codTipoSala = codTipoSala;
	}
	  
    @ManyToOne   //aqui nao consigo configurar
    @JoinColumn(name="codtiposala")   
	private TipoSala tipoSala;
	
	
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL) 
		@JoinColumns(value={
				@JoinColumn(name="codcampus",insertable=false,updatable=false),
				@JoinColumn(name="codbloco",insertable=false,updatable=false),
				@JoinColumn(name="codpavimento",insertable=false,updatable=false)
		})
	private Andar andar;
//gets e sets omitidos
@Entity
public class TipoSala implements Serializable{
	@Id
	@Column(name="codtiposala") 
	private int codTipoSala;
	@Column(name="dsctiposala")
	private String dscTipoSala;
//gets e sets omitidos

Como faço para dizer que tiposala em sala é uma chave estrangeira de tiposala e como faço para cascatear para uma possivel exclusão futura em uma classe filha de sala(Se não fui claro me avisem…rs).

Você deve colocar este código no get e não na declaração.
Ex:
private TipoSala tipoSala;

@ManyToOne
@JoinColumn(name=“codtiposala”)
public TipoSala getTipoSala(){return tipoSala;}

Deu o erro:

Caused by: java.sql.SQLException: Nome de coluna inválido

Isso tanto colocando no get ou declaração.

Abaixo esta a estrutura da minha tabela
SQL> desc sala;
 Name                            Null?    Type
 ------------------------------- -------- ----
 CODSALA                         NOT NULL VARCHAR2(5)
 CAPACIDADE                               NUMBER(5)
 ARCONDICIONADO                           NUMBER(2)
 VENTILADOR                               NUMBER(2)
 ATIVO                                    VARCHAR2(1)
 DSCSALA                                  VARCHAR2(50)
 TIPOQUADRO                               VARCHAR2(20)
 DATASHOW                                 VARCHAR2(1)
 CODCAMPUS                       NOT NULL VARCHAR2(2)
 CODBLOCO                        NOT NULL VARCHAR2(1)
 CODPAVIMENTO                    NOT NULL NUMBER(5)
 CODTIPOSALA                     NOT NULL NUMBER(5)

@ManyToOne
@JoinColumn(name=“XXX”)
public TipoSala getTipoSala(){return tipoSala;}

onde XXX é o nome do id da tabela TipoSala, pelo que estou vendo deve ser “CODTIPOSALA” e não “codtiposala”. Verifica se o nome do campo id da tabela tipo sala é CODTIPOSALA.

Obrigado pelas respostas.
Bem, eu tentei com CODTIPOSALA e codtiposala e continua a mesma coisa… :shock:

could not read column value from result set: tipoSala; Nome de coluna inválido

Remova essa declaração:

     @Column(name="codtiposala")  
     private int codTipoSala;  
       
     public int getCodTipoSala() {  
         return codTipoSala;  
     }  
     public void setCodTipoSala(int codTipoSala) {  
         this.codTipoSala = codTipoSala;  
     }

A coluna codtiposala faz parte da chave estrangeira e não deve fazer parte do seu objeto.

A propósito, você pode colocar anotações na propriedade privada sim, não precisa ser no getter.

Vlw!
O problema foi resolvido ao retirar a declaração.
Mas cai em outro na hora de deletar uma classe filha de sala.Vide classe:

@Entity
@Table(name="aloca_turma_sala")
public class Aloca implements Serializable{
	
	@EmbeddedId
	private AlocaPK id;
	
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codcampus",insertable=false,updatable=false)
	private Campus campus;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumns(value={
				@JoinColumn(name="codcampus",insertable=false,updatable=false),
				@JoinColumn(name="codbloco",insertable=false,updatable=false)
		})
	private Bloco bloco;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codpavimento",insertable=false,updatable=false)
	private Pavimento pavimento;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
	@JoinColumns(value={
			@JoinColumn(name="codcampus",insertable=false,updatable=false),
			@JoinColumn(name="codbloco",insertable=false,updatable=false),
			@JoinColumn(name="codpavimento",insertable=false,updatable=false),
			@JoinColumn(name="codsala",insertable=false,updatable=false),
	})
	private Sala sala;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codturma",insertable=false,updatable=false)
	private Turma turma;
	@Column(name="horainicio",insertable=false,updatable=false)
	private String horaInicio;
	@Column(name="horafim",insertable=false,updatable=false)
	private String horaFim;
	@Column(name="diasemana",insertable=false,updatable=false)
	private String diaSemana;

Eu mando deletar uma alocação, ai ele começa a dar selects em tabelas, qdo chega na tabela SALA ao dar o select ele dá a seguinte mensagem:

 select
        sala0_.codsala as codsala4_1_,
        sala0_.codcampus as codcampus4_1_,
        sala0_.codbloco as codbloco4_1_,
        sala0_.codpavimento as codpavim4_4_1_,
        sala0_.capacidade as capacidade4_1_,
        sala0_.arcondicionado as arcondic6_4_1_,
        sala0_.ventilador as ventilador4_1_,
        sala0_.ativo as ativo4_1_,
        sala0_.dscsala as dscsala4_1_,
        sala0_.tipoquadro as tipoquadro4_1_,
        sala0_.datashow as datashow4_1_,
        sala0_.codtiposala as codtipo12_4_1_,
        tiposala1_.codtiposala as codtipos1_5_0_,
        tiposala1_.dsctiposala as dsctipos2_5_0_ 
    from
        Sala sala0_,
        TipoSala tiposala1_ 
    where
        sala0_.codtiposala=tiposala1_.codtiposala(+) 
        and sala0_.codsala=? 
        and sala0_.codcampus=? 
        and sala0_.codbloco=? 
        and sala0_.codpavimento=?
Não foi possivel fazer a exclusão de turmas na sala
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.unig.scif.modelo.Sala#br.unig.scif.modelo.SalaPK@5b891]
	at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:375)
	at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	at org.hibernate.engine.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:537)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:57)
	at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:775)
	at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:758)
	at org.hibernate.engine.CascadingAction$2.cascade(CascadingAction.java:121)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
	at org.hibernate.event.def.DefaultDeleteEventListener.cascadeAfterDelete(DefaultDeleteEventListener.java:292)
	at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:240)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:128)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:49)
	at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:766)
	at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:744)
	at br.unig.scif.dao.Dao.remove(Dao.java:21)
	at br.unig.scif.bean.AlocaBean.deletarTurmasAction(AlocaBean.java:222)
	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:152)
	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:77)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
	at org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1131)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	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:141)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	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:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Desde jah agradeço!

Porque você coloca cascade=CascadeType.ALL nas anotações?

Dê uma olhada em http://java.sun.com/javaee/5/docs/api/javax/persistence/CascadeType.html pra você ver os tipos de cascata possíveis. Mas se você não sabe qual por, melhor não colocar nenhum.

Eu tirei e funcionou.

Vlw msm!

Mas para que serve o cascade???

Eu vi em outro lugar, num exemplo dizendo que tinha que ter para fazer a exclusão.

:?: