Dao de entidade com chave composta

2 respostas
adrianohardcore

Boa tarde , fiz um mapeamento de uma tabela que não contem chave estrangeira e possui 2 chaves :
Dser

package model;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "DSER")
public class Dser  {	
	@EmbeddedId
    private DserPK dserPK;
	@Column(name = "DSERNOME")
	private String dsernome;
	@Column(name = "DSERSERIAL")
	private Long dserserial;
	@Column(name = "DSERDTALT")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dserdtalt;
	@Column(name = "DSERUSR")
	private Short dserusr;
	@Column(name = "DSERPAR1")
	private Long dserpar1;
	@Column(name = "DSERPAR2")
	private Long dserpar2;
	// @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
	@Column(name = "DSERPAR3")
	private BigDecimal dserpar3;
	//@Size(max = 20)
	@Column(name = "DSERPAR4")
	private String dserpar4;
	//@Size(max = 60)
	@Column(name = "DSERHIS")
	private String dserhis;	
	public void setDsernome(String dsernome) {
		this.dsernome = dsernome;
	}
	public String getDsernome() {
		return dsernome;
	}
	public void setDserserial(Long dserserial) {
		this.dserserial = dserserial;
	}
	public Long getDserserial() {
		return dserserial;
	}
	public void setDserdtalt(Date dserdtalt) {
		this.dserdtalt = dserdtalt;
	}
	public Date getDserdtalt() {
		return dserdtalt;
	}
	public void setDserusr(Short dserusr) {
		this.dserusr = dserusr;
	}
	public Short getDserusr() {
		return dserusr;
	}
	public void setDserpar1(Long dserpar1) {
		this.dserpar1 = dserpar1;
	}
	public Long getDserpar1() {
		return dserpar1;
	}
	public void setDserpar2(Long dserpar2) {
		this.dserpar2 = dserpar2;
	}
	public Long getDserpar2() {
		return dserpar2;
	}
	public void setDserpar3(BigDecimal dserpar3) {
		this.dserpar3 = dserpar3;
	}
	public BigDecimal getDserpar3() {
		return dserpar3;
	}
	public void setDserpar4(String dserpar4) {
		this.dserpar4 = dserpar4;
	}
	public String getDserpar4() {
		return dserpar4;
	}
	public void setDserhis(String dserhis) {
		this.dserhis = dserhis;
	}
	public String getDserhis() {
		return dserhis;
	}
	public void setDserPK(DserPK dserPK) {
		this.dserPK = dserPK;
	}
	public DserPK getDserPK() {
		return dserPK;
	}

}

DserPK

package model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;


@Embeddable
public class DserPK implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Column
	private short dserest;
	@Column
	private String dserpar;
	public DserPK(){    	
	}

	public short getDserest() {
		return dserest;
	}

	public void setDserest(short dserest) {
		this.dserest = dserest;
	}

	public String getDserpar() {
		return dserpar;
	}

	public void setDserpar(String dserpar) {
		this.dserpar = dserpar;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + dserest;
		result = prime * result + ((dserpar == null) ? 0 : dserpar.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DserPK other = (DserPK) obj;
		if (dserest != other.dserest)
			return false;
		if (dserpar == null) {
			if (other.dserpar != null)
				return false;
		} else if (!dserpar.equals(other.dserpar))
			return false;
		return true;
	}

}

Com ajuda do gerador de classe do netbeans e pesquisas no google , montei estas duas classes.Mas o problema é que eu não sei como implementar o dao para estas classes , por exemplo , um dao de uma tabela simples
Agenda

package dao;

import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import model.Agenda;
import repository.AgendaRepository;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class AgendaDao implements AgendaRepository{
	private final EntityManager manager;

	public AgendaDao(EntityManager manager){
		this.manager = manager;		 
	}

	public Collection<Agenda> loadAll() {
		Query query = manager.createQuery("from Agenda");

		@SuppressWarnings("unchecked")
		Collection<Agenda> resultList = query.getResultList();

		return resultList;
	}

	public void remove(Agenda agenda) {
		manager.remove(manager.getReference(Agenda.class, agenda.getAgdcod()));		
	}

	public Agenda save(Agenda agenda) {
		return manager.merge(agenda);
	}

	public Agenda loadByAgdCod(Integer agdcod) {
		return manager.find(Agenda.class, agdcod);
	}

	public Integer countByFilter(String search, String find) {
		Query query = manager.createQuery("select count(e.agdcod) from Agenda e where e." + find + " like :search");
		query.setParameter("search", "%" + search + "%");

		return ((Long) query.getSingleResult()).intValue();
	}

	public Collection<Agenda> listByFilter(String search, int page, String sortName, String sortOrder, String find, int rows) {
		String sql = "from Agenda e where e." + find + " like :search";
		String order = " order by e." + find;

		if (sortName != null && !sortName.isEmpty()) {
			order = " order by e." + sortName;
		}

		if (sortOrder != null && !sortOrder.isEmpty()) {
			order += " " + sortOrder;
		}

		int inicio = (page - 1) * rows;

		Query query = manager.createQuery(sql + order);
		query.setFirstResult(inicio);
		query.setMaxResults(rows);

		query.setParameter("search", "%" + search + "%");

		@SuppressWarnings("unchecked")
		Collection<Agenda> resultList = query.getResultList();

		return resultList;
	}
}

E agora quando eu quero por exemplo um loadbyid

public Agenda loadByAgdCod(Integer agdcod) {
		return manager.find(Agenda.class, agdcod);
	}

No lugar de agdcod oque eu colocaria ,DserPK?Alguem teria um exemplo de um dao que manipula chaves compostas ?No caso estou usando Vraptor ,Hibernate Jpa e MS Sql Server

2 Respostas

WRYEL

sim

public Dser loadByAgdCod(DserPK dserPK) {
		return manager.find(Dser.class, dserPK);
}

edit: todos os atributos do DserPK tem que estar preenchidos.

[]s

adrianohardcore

WRYEL:
adrianohardcore:

E agora quando eu quero por exemplo um loadbyid

public Agenda loadByAgdCod(Integer agdcod) {
		return manager.find(Agenda.class, agdcod);
	}

No lugar de agdcod oque eu colocaria ,DserPK?Alguem teria um exemplo de um dao que manipula chaves compostas ?No caso estou usando Vraptor ,Hibernate Jpa e MS Sql Server

sim

public Dser loadByAgdCod(DserPK dserPK) {
		return manager.find(Dser.class, dserPK);
}

edit: todos os atributos do DserPK tem que estar preenchidos.

[]s

Obrigado , consegui resolver com

public Dser loadByDser(Object id) {
		return manager.find(Dser.class, id);		
	}

Pelo o que eu entendi , quando a classe usa chave composta quando se precisar fazer um carregamento pelo código e só usar a id que esta marcado com @EmbeddedId . Então a classe que tem as chaves nunca serão referenciado , pelo menos não no meu projeto.Mesmo não sabendo explicar muito bem vou colocar como ficou a minha DserDao , só para referencia :

package dao;

import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import model.Dser;
import repository.DserRepository;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class DserDao implements DserRepository{

	private final EntityManager manager;
	public DserDao(EntityManager manager){
		this.manager = manager;
	}

	public Collection<Dser> loadAll() {
		Query query = manager.createQuery("from Dser");
		@SuppressWarnings("unchecked")
		Collection<Dser> resultList = query.getResultList();
		return resultList;
	}

	public Dser save(Dser dser) {
		return manager.merge(dser);
	}

	public Dser loadByDser(Object id) {
		return manager.find(Dser.class, id);		
	}


	public void remove(Dser dser) {
		manager.remove(manager.getReference(Dser.class,dser.getId()));		
	}
}
Criado 5 de fevereiro de 2012
Ultima resposta 7 de fev. de 2012
Respostas 2
Participantes 2