Alguem me ajuda com busca com chaves compostas!

5 respostas
pimentaft

Como faço uma busca com chaves compostas neste caso???

@Entity
@Table(name="aloca_turma_sala")
public class Aloca implements Serializable{
	
	@EmbeddedId
	private AlocaPK id;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumns(value={
			@JoinColumn(name="codsala",insertable=false,updatable=false),       
		    @JoinColumn(name="codcampus",insertable=false,updatable=false),       
		    @JoinColumn(name="codbloco",insertable=false,updatable=false),       
		    @JoinColumn(name="codpavimento",insertable=false,updatable=false),       
	})
	private Sala sala;
	@ManyToOne(fetch=FetchType.LAZY)
		@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;
@Embeddable
public class AlocaPK implements Serializable{
	@Column(name="codcampus")
	private String codCampus;
	@Column(name="codbloco")
	private String codBloco;
	@Column(name="codpavimento")
	private Long codPavimento;
	@Column(name="codsala")
	private String codSala;
	@Column(name="codturma")
	private String codTurma;
	@Column(name="horainicio")
	private String horaInicio;
	@Column(name="horafim")
	private String horaFim;
	@Column(name="diasemana")
	private String diaSemana;

Eu tento assim:

AlocaPK id = new AlocaPK();
				id.setCodBloco(codbloco);
				id.setCodCampus(codcampus);
				id.setCodPavimento(codpavimento);
				id.setCodSala(codsala);
				id.setCodTurma(matriculado.getId().getCodTurma());
				id.setDiaSemana(diasemana);
				id.setHoraFim(horafim);
				id.setHoraInicio(horainicio);
				
				Aloca aloca = new Dao<Aloca>(session,Aloca.class).procura(id);

Dao:

public T procura(Serializable id) {     
	       return (T) session.load(this.classe, id);     
	}

O erro:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.unig.scif.modelo.Aloca#br.unig.scif.modelo.AlocaPK@1b1b1f0]
	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.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:172)
	at br.unig.scif.modelo.Aloca$$EnhancerByCGLIB$$6791699a.getId(<generated>)
	at br.unig.scif.bean.AlocaBean.unirTurmasAction(AlocaBean.java:298)

Alguem me socorre ae!!!

5 Respostas

L

É exatamente assim que se busca com chave composta…
vc instancia o objeto chave que implementa Serializable, e passa como identificador…
o erro diz que não há uma linha com esse identificador…
já verificou isso?

pimentaft

Opa!
Obrigado por me responder.
Me desculpe minha ignorância, mas essa linha seria do banco???

L

uma coisa que nao tinha eparado…
se vc quer um objeto passando um identificador, obrigatoriamente voce vai ter como resultado um único registro… logo, use:

AlocaPk pk = new AlocaPk(.....);
Aloca aloca = (Aloca)session.get(Aloca.class, pk);
L

respondendo a anterior, a linha a que me referi é um registro de uma tabela do banco…
neste caso, a tabela ‘aloca_turma_sala’

pimentaft

Opa!
Obrigado!
Achei minha falha…
Eu estava passando um codigo de sala que realmente não batia com a alocação cadastrada no banco.

Vlw!

Criado 15 de dezembro de 2008
Ultima resposta 15 de dez. de 2008
Respostas 5
Participantes 2