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