当前位置: 首页 > 知识库问答 >
问题:

Java Jpa Hibernate分离实体pases以在合并时持久化

孟成文
2023-03-14

我正在尝试使用JPA合并具有@OneTo多人关系的实体,但它会抛出设置为持久化错误的分离实体。我没有持久化实体,我正在合并它。我只是在使用连接获取将Alumno实体加载到他的Matcourse a实体时遇到问题。以下是代码:

注:Alumno指学生,Asignatura指学科,Matricula指学生学科,是一名学生与其学科之间的关系。这种关系有很多种,都有额外的桌子。

更详细的信息:使用下一个查询获取学生:“从学生a内部连接中选择a获取a.matriculas,其中iduser=:iduser和password=:password”。然后我关闭实体管理器并更改学生的姓名。当我尝试合并(使用entityManager.merge(student))学生时,我得到了分离的实体pased以保持错误。如果实体校友的名单为空,我没有问题。

第一个实体:

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。模型

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);
}

共有2个答案

禄俊逸
2023-03-14

在hibernate上使用@IdClass时出现了一个错误,这就是导致错误的原因。最简单的解决方案是避免使用@IdClass,并为主体和学生之间的实体(Matricula)创建@Id。

聂迪
2023-03-14

如果学生有主题,您需要将其管理到当前事务。

您需要执行以下代码:

beginTransaction();
entityManager.persist(matricula);
Subject subject = getSubjectUsingEntityManager(subjectId);
newStudent.setMatricula(matricula);
newStudent.addSubject(subject);
commitTransaction();
 类似资料:
  • 我有一个问题,分离实体传递到持久性。我以为我知道什么是超然的实体,但显然这对我来说太多了...因此,无论如何,我试图创建一个Person对象,该对象具有一个Interviewer对象,而Interviewer对象具有一个Office对象,每次尝试持久化Person时,我都会得到异常(在本例中,Office是分离的实体)。相关代码如下所示: 是帮助器类的静态方法: 您可能会注意到创建面试官的help

  • 问题内容: 我正在尝试使用Hibernate EntityManagerpersist方法将个人pojo插入mysql db, 得到这个例外 还有更多.. 我的Person.java类是, 然后是pojo的getter setter方法。 引发TitleType类的错误是“公共静态最终”标题类型定义提供程序, 我正在为人员设置标题类型类, 不可能将公共静态最终类型定义的类传递给Hibernate?

  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

  • 我有一个类通知,它包含一个对象MessengerData:

  • 问题内容: 我已经成功用hibernate写了我的第一个主要的孩子例子。几天后,我再次使用它并升级了一些库。不知道我做了什么,但是我再也无法使它运行了。有人可以帮助我找出返回以下错误消息的代码中的错误吗: hibernate映射: 编辑: InvoiceManager.java 发票.java InvoiceItem.java 编辑: 从客户端发送的JSON对象: 编辑: 一些详细信息: 我试图通

  • 这个网站上没有一个类似的问题能够解决我的问题。 错误:org.hibernate.persistentobjectexception:传递给persist:healthcheckapi.model.checks的分离实体 示例JSON健康对象: 请注意,这两个对象的ID都是自动生成的,我认为这是问题的一部分。