Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fernandopaiva

relacionamento JPA ?

Recommended Posts

Salve galera

 

Estou tentando fazer um JOIN usando CriteriaQuery. Tenho um relacionamento @OneToOne onde li que tenho q fazer um "mappedBy" do lado da entidade fraca pois a JPA não existe um relacionamento bidirecional.

Bem, como fazer isso ???

 

aqui esta meu codigo.

@Entity
@Table(name="curriculum")
public class Curriculum implements Serializable{
private static final long serialVersionUID = 1L;
 
@Id
@GeneratedValue
private Long idCurriculum;
 
@Temporal(TemporalType.DATE)
private Date dataCad;
 
@Size(min=5, max=50)
@NotNull
@NotEmpty 
private String nome;
 
@NotEmpty
private String sexo;
 
@Email
@NotEmpty
@NotNull
@Size(max=250)
@Column(unique=true)
private String email;
 
@NotNull
@NotEmpty
@Size(min=14, max=14)
@Column(unique=true)
private String cpf;
 
@NotEmpty
@NotNull
@Size(min=8, max=8)
private String senha;
 
@OneToOne
@NotNull
@JoinColumn(name="idCargo")
private Cargo cargo;
 
private String ativado = "N";
 
public Curriculum() { 
this(new Long(0), new Date(), "", "", "", "", "", new Cargo());
}
 
 
public Curriculum(Long idCurriculum, Date dataCad, String nome, String sexo,
String email, String cpf, String senha, Cargo cargo) { 
this.idCurriculum = idCurriculum;
this.dataCad = dataCad;
this.nome = nome; 
this.sexo = sexo;
this.email = email;
this.cpf = cpf;
this.senha = senha;
this.cargo = cargo;
}
 
public Long getIdCurriculum() {
return idCurriculum;
}
 
public void setIdCurriculum(Long idCurriculum) {
this.idCurriculum = idCurriculum;
}
 
public Date getDataCad() {
return dataCad;
}
 
public void setDataCad(Date dataCad) {
this.dataCad = dataCad;
}
 
public String getNome() {
return nome;
}
 
public void setNome(String nome) {
this.nome = nome;
}
 
public String getEmail() {
return email;
}
 
public void setEmail(String email) {
this.email = email;
}
 
public String getCpf() {
return cpf;
}
 
public void setCpf(String cpf) {
this.cpf = cpf;
}
 
public String getSenha() {
return senha;
}
 
public void setSenha(String senha) {
this.senha = senha;
}
 
public Cargo getCargo() {
return cargo;
}
 
public void setCargo(Cargo cargo) {
this.cargo = cargo;
}
 
public String getAtivado() {
return ativado;
}
 
public void setAtivado(String ativado) {
this.ativado = ativado;
}
 
public String getSexo() {
return sexo;
}
 
public void setSexo(String sexo) {
this.sexo = sexo;
}
}
 
 

@Entity
@Table(name="escolaridade")
public class Escolaridade implements Serializable{
private static final long serialVersionUID = 1L;
 
@Id
@GeneratedValue
private Integer idEscola;
 
@NotNull @NotEmpty @Size(min=5,max=50)
private String escola;
 
@NotNull @NotEmpty @Size(min=5,max=50)
private String cidade;
 
@NotNull
private String estado;
 
@NotNull @Temporal(TemporalType.DATE)
private Date inicio;
 
@Temporal(TemporalType.DATE)
private Date conclusao;
 
@NotNull 
private String ensino;
 
@NotNull @OneToOne @JoinColumn(name="idCurriculum")
private Curriculum curriculum;
 
public Escolaridade() {
this(0, "", "", 
"", null, "", new Curriculum() );
}
 
public Escolaridade(Integer idEscola, String escola, String cidade,
String estado, Date inicio, String ensino, Curriculum curriculum) {
super();
this.idEscola = idEscola;
this.escola = escola;
this.cidade = cidade;
this.estado = estado;
this.inicio = inicio;
this.ensino = ensino;
this.curriculum = curriculum;
}
 
public Integer getIdEscola() {
return idEscola;
}
 
public void setIdEscola(Integer idEscola) {
this.idEscola = idEscola;
}
 
public String getEscola() {
return escola;
}
 
public void setEscola(String escola) {
this.escola = escola;
}
 
public String getCidade() {
return cidade;
}
 
public void setCidade(String cidade) {
this.cidade = cidade;
}
 
public String getEstado() {
return estado;
}
 
public void setEstado(String estado) {
this.estado = estado;
}
 
public Date getInicio() {
return inicio;
}
 
public void setInicio(Date inicio) {
this.inicio = inicio;
}
 
public Date getConclusao() {
return conclusao;
}
 
public void setConclusao(Date conclusao) {
this.conclusao = conclusao;
}
 
public String getEnsino() {
return ensino;
}
 
public void setEnsino(String ensino) {
this.ensino = ensino;
}
 
public Curriculum getCurriculum() {
return curriculum;
}
 
public void setCurriculum(Curriculum curriculum) {
this.curriculum = curriculum;
} 
 
}
 
 
// CriteriaQuery

public List<Curriculum> getCurriculumReport(Long id){
List<Curriculum> lista = new ArrayList<Curriculum>();
 
EntityManager em = datasource.getEntityProvider().getEntityManager(); 
CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Curriculum> c = cb.createQuery(Curriculum.class);        
        Root<Curriculum> root = c.from(Curriculum.class);        
        Join<Curriculum, Cargo> joinCCargo = root.join("cargo");
         Join<Curriculum, Escolaridade> joinCE = root.join("curriculum");
        
        c.where(cb.equal(root.get("idCurriculum"), cb.parameter(Long.class, "id")));
        TypedQuery q = em.createQuery(c);
        q.setParameter("id", id);
        
        lista = q.getResultList();
        
return lista;
}


 Sempre que tento fazer um JOIN, tenho a seguinte exception: Caused by: java.lang.IllegalArgumentException: Unable to resolve attribute [curriculum] against path [null] 
Como resolver ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido.

 

Eu entendi como funciona, eh o seguinte.

Para uma relação bi-direcional os dois lados tem q se conhecer. Diferente do unidirecional que apenas um lado pode conhecer.

Por exemplo: Curriculum tem que conhecer Escolaridade e Escolaridade tem que conhecer Curriculum.

 

Entaum fiz essa mudança nos meus beans.

 

 

@Entity
@Table(name="curriculum")
public class Curriculum implements Serializable{
private static final long serialVersionUID = 1L;
 
@Id
@GeneratedValue
private Long idCurriculum;
 
@Temporal(TemporalType.DATE)
private Date dataCad;
 
@Size(min=5, max=50)
@NotNull
@NotEmpty 
private String nome;
 
@NotEmpty
private String sexo;
 
@Email
@NotEmpty
@NotNull
@Size(max=250)
@Column(unique=true)
private String email;
 
@NotNull
@NotEmpty
@Size(min=14, max=14)
@Column(unique=true)
private String cpf;
 
@NotEmpty
@NotNull
@Size(min=8, max=8)
private String senha;
 
@OneToOne
@NotNull
@JoinColumn(name="idCargo")
private Cargo cargo;
 
private String ativado = "N";
 
//aqui a alteracao, eu crio o atributo escolaridade e faço o mapeamento com o msm nome da classe 
@OneToOne(mappedBy="curriculum")
private Escolaridade escolaridade;
 
//constructor/get/set
}
 
 

@Entity
@Table(name="escolaridade")
public class Escolaridade implements Serializable{
private static final long serialVersionUID = 1L;
 
@Id
@GeneratedValue
private Integer idEscola;
 
@NotNull @NotEmpty @Size(min=5,max=50)
private String escola;
 
@NotNull @NotEmpty @Size(min=5,max=50)
private String cidade;
 
@NotNull
private String estado;
 
@NotNull @Temporal(TemporalType.DATE)
private Date inicio;
 
@Temporal(TemporalType.DATE)
private Date conclusao;
 
@NotNull 
private String ensino;
 
//aqui mantive tudo como antes, a alteração msm foi apenas na classe curriculum, o @JoinColumn idCurriculum eh minha Foreign Key
@NotNull @OneToOne @JoinColumn(name="idCurriculum")
private Curriculum curriculum;
}

 
 

 

E foi isso, esta funcionando agora :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.