2014-11-12 2 views
0

Я пытаюсь объединить Entity, у которого есть отношения @OneToMany с использованием JPA, но он выдает удаленный объект поэтапно, чтобы сохранить ошибку. Я не настаиваю на сущности, я ее слияю. У меня проблема только при загрузке объекта Alumno с его объектами Matricula с использованием ссылки. Вот код:Java-Jpa-Hibernate Отдельные сущности для сохранения слияния

Примечание: Выпускница означает «Студент», «Asignatura» означает «Субъект» и «Матрица» означает «Учащийся-субъект» - это отношения между одним учеником и его субъектами. Это отношение ManyToMany с дополнительной таблицей.

Подробнее: Получить студента со следующим запросом: «выберите из« Студент »внутреннее соединение, выберите a.matriculas, где iduser =: iduser и password =: password». Затем я закрываю диспетчер объектов и меняю имя студента. Когда я пытаюсь объединиться (используя entityManager.merge (student)), учащемуся я получаю удаленный объект, поставленный для сохранения ошибки. Если Список в сущности Alumno равен null, у меня нет проблемы.

Первый объект:

package com.sdi.model; 

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Alumno") 
public class Alumno implements UsuarioRegistrado { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
    private String nombre, apellidos, iduser, email, password; 
    private boolean cuentaActivada; 

    @OneToMany(mappedBy="alumno") 
    private List<Matricula> matriculas = new ArrayList<Matricula>(); 

    public Alumno() { } 

    public Alumno(Long id) { 
     setId(id); 
    } 

    public String getNombre() { 
     return nombre; 
    } 

    public void setNombre(String nombre) { 
     this.nombre = nombre; 
    } 

    public String getApellidos() { 
     return apellidos; 
    } 

    public void setApellidos(String apellidos) { 
     this.apellidos = apellidos; 
    } 

    public String getIduser() { 
     return iduser; 
    } 

    public void setIduser(String iduser) { 
     this.iduser = iduser; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Long getId() { 
     return id; 
    } 

    public boolean isCuentaActivada() { 
     return cuentaActivada; 
    } 

    public void setCuentaActivada(boolean cuentaActivada) { 
     this.cuentaActivada = cuentaActivada; 
    } 

    public List<Matricula> getMatriculas() { 
     return matriculas; 
    } 

    public void setMatriculas(List<Matricula> matriculas) { 
     this.matriculas = matriculas; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.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; 
     Alumno other = (Alumno) obj; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Alumno [id=" + id + ", nombre=" + nombre + ", apellidos=" 
       + apellidos + ", iduser=" + iduser + ", email=" + email 
       + ", password=" + password + ", cuentaActivada=" 
       + cuentaActivada + "]"; 
    } 

    @Override 
    public String paginaPrincipal() { 
     return "/alumno/alumno-opciones.xhtml"; 
    } 

    public void addMatricula(Matricula matricula){ 
     if(!getMatriculas().contains(matricula)){ 
      getMatriculas().add(matricula); 
      matricula.setAlumno(this); 
     } 
    } 

    @Override 
    public List<Docencia> getImparte() { 
     return null; 
    } 

} 

Второе лицо: пакет com.sdi.model;

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.IdClass; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name="MATRICULADO") 
@IdClass(MatriculaPk.class) 
public class Matricula { 

    @Id @ManyToOne 
    private Alumno alumno; 
    @Id @ManyToOne 
    private Asignatura asignatura; 

    public Matricula() { } 

    public Matricula(Alumno alumno, Asignatura asignatura) { 
     this.alumno = alumno; 
     this.asignatura = asignatura; 
     alumno.addMatricula(this); 
     asignatura.addMatricula(this); 
    } 

    public Alumno getAlumno() { 
     return alumno; 
    } 

    public void setAlumno(Alumno alumno) { 
     this.alumno = alumno; 
    } 

    public Asignatura getAsignatura() { 
     return asignatura; 
    } 

    public void setAsignatura(Asignatura asignatura) { 
     this.asignatura = asignatura; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((alumno == null) ? 0 : alumno.hashCode()); 
     result = prime * result 
       + ((asignatura == null) ? 0 : asignatura.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; 
     Matricula other = (Matricula) obj; 
     if (alumno == null) { 
      if (other.alumno != null) 
       return false; 
     } else if (!alumno.equals(other.alumno)) 
      return false; 
     if (asignatura == null) { 
      if (other.asignatura != null) 
       return false; 
     } else if (!asignatura.equals(other.asignatura)) 
      return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Matricula [alumno=" + alumno + ", asignatura=" + asignatura 
       + "]"; 
    } 

} 

И это операция слияния:

@Override 
public Object execute() throws BusinessException { 
    return Jpa.getManager().merge(alumno); 
} 

ответ

0

Существует ошибка с использованием @IdClass на спящий режим, и это то, что вызывает ошибку. Самое простое решение - избежать использования @IdClass и создать @Id для объекта (Matricula) между Subject и Student.

1

Если студент имеет Subject, вы должны управлять его текущей транзакции.

Вам нужно будет сделать код как:

beginTransaction(); 
entityManager.persist(matricula); 
Subject subject = getSubjectUsingEntityManager(subjectId); 
newStudent.setMatricula(matricula); 
newStudent.addSubject(subject); 
commitTransaction(); 
+0

Я забыл сказать, что проблема возникает, когда я изменяю имя студента или любые другие атрибуты. Я не добавляю никаких новых предметов к Студенту. Нужно ли мне постоянно сохранять «матикулуму»? – zequihg50

+0

Проверьте, имеет ли у ученика действительный идентификатор (! = Null). Возможно, ваш идентификатор недействителен, и JPA пытается создать новый. – uaiHebert

+0

Идентификатор ученика правильный (System.out.println (ученик) перед слиянием). Это происходит, когда я беру коллекцию с запросом, который я опубликовал, когда я привожу только ученика, он отлично работает – zequihg50

Смежные вопросы