简体   繁体   English

Java中具有多对一关系的持久实体

[英]Persist Entity with ManyToOne relationship in Java

I have two classes: Equipo and Sesion.我有两个班级:Equipo 和 Sesion。 Sesion contains one Equipo equipo with a relationship of ManyToOne. Sesion 包含一个具有多对一关系的 Equipo 设备。

When I want to persist a new Sesion I do the following:当我想保留一个新的会话时,我会执行以下操作:

1.- I create the Sesion. 1.- 我创建了会话。

2.- I get a reference to Equipo 2.- 我得到了 Equipo 的参考

long id = findEquipo();
Equipo e = entityManager.getReference(Equipo.class, id);

3.- I set Sesion's equipo 3.- 我设置了 Sesion 的均衡器

sesion.setEquipo(e);

4.- Finally I persist the new Sesion. 4.- 最后我坚持新的会议。

entityManager.persist(sesion);

But everytime I get an error saying that I violate the unique rule because I guess the entity manager is trying to save equipo as a new record on the table instead of just asociate it to sesion.但是每次我收到一个错误,说我违反了唯一规则,因为我猜实体管理器正试图将equipo 保存为表上的新记录,而不是仅仅将它与会话相关联。

Do you have any idea of what is going on?你知道发生了什么吗?

Sesion class:会话类:

@Entity
@NamedQuery(name="Sesion.findAll", query="SELECT s FROM Sesion s")
public class Sesion implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    private Timestamp fin;

    @Column(name="FOLIO_ALUMNO")
    private BigDecimal folioAlumno;

    @Column(name="FOLIO_PROF")
    private BigDecimal folioProf;

    @Column(name="ID_HORARIO")
    private BigDecimal idHorario;

    private String matricula;

    private Timestamp registro;

    private BigDecimal status;

    private String tokenusoft;

    //bi-directional many-to-one association to Bitacora
    @OneToMany(mappedBy="sesion")
    private List<Bitacora> bitacoras;

    //bi-directional many-to-one association to Equipo
    @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name="ID_EQUIPO")
    private Equipo equipo;

    //bi-directional many-to-one association to SesionSoft
    @OneToMany(mappedBy="sesion")
    private List<SesionSoft> sesionSofts;

    public Sesion() {
    }

    public String getId() {
        return this.id;
    }

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

    public Timestamp getFin() {
        return this.fin;
    }

    public void setFin(Timestamp fin) {
        this.fin = fin;
    }

    public BigDecimal getFolioAlumno() {
        return this.folioAlumno;
    }

    public void setFolioAlumno(BigDecimal folioAlumno) {
        this.folioAlumno = folioAlumno;
    }

    public BigDecimal getFolioProf() {
        return this.folioProf;
    }

    public void setFolioProf(BigDecimal folioProf) {
        this.folioProf = folioProf;
    }

    public BigDecimal getIdHorario() {
        return this.idHorario;
    }

    public void setIdHorario(BigDecimal idHorario) {
        this.idHorario = idHorario;
    }

    public String getMatricula() {
        return this.matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public Timestamp getRegistro() {
        return this.registro;
    }

    public void setRegistro(Timestamp registro) {
        this.registro = registro;
    }

    public BigDecimal getStatus() {
        return this.status;
    }

    public void setStatus(BigDecimal status) {
        this.status = status;
    }

    public String getTokenusoft() {
        return this.tokenusoft;
    }

    public void setTokenusoft(String tokenusoft) {
        this.tokenusoft = tokenusoft;
    }

    public List<Bitacora> getBitacoras() {
        return this.bitacoras;
    }

    public void setBitacoras(List<Bitacora> bitacoras) {
        this.bitacoras = bitacoras;
    }

    public Bitacora addBitacora(Bitacora bitacora) {
        getBitacoras().add(bitacora);
        bitacora.setSesion(this);

        return bitacora;
    }

    public Bitacora removeBitacora(Bitacora bitacora) {
        getBitacoras().remove(bitacora);
        bitacora.setSesion(null);

        return bitacora;
    }

    public Equipo getEquipo() {
        return this.equipo;
    }

    public void setEquipo(Equipo equipo) {
        this.equipo = equipo;
    }

    public List<SesionSoft> getSesionSofts() {
        return this.sesionSofts;
    }

    public void setSesionSofts(List<SesionSoft> sesionSofts) {
        this.sesionSofts = sesionSofts;
    }

    public SesionSoft addSesionSoft(SesionSoft sesionSoft) {
        getSesionSofts().add(sesionSoft);
        sesionSoft.setSesion(this);

        return sesionSoft;
    }

    public SesionSoft removeSesionSoft(SesionSoft sesionSoft) {
        getSesionSofts().remove(sesionSoft);
        sesionSoft.setSesion(null);

        return sesionSoft;
    }

}

Equipo class:装备类:

@Entity
@NamedQuery(name="Equipo.findAll", query="SELECT e FROM Equipo e")
public class Equipo implements Serializable {
    private static final long serialVersionUID = -5643266334261806130L;

    @Id
    private long id;

    private BigDecimal activofijo;

    private String arch;

    private String equipo;

    private String hd;

    private String macaddr;

    private String modelo;

    private String name;

    private String noseriecpu;

    private String noseriemonitor;

    private String noserieraton;

    private String noserietecl;

    private String patchlevel;

    private String ram;

    private String so;

    private BigDecimal status;

    private String vendor;

    private String vendorcodename;

    private String vendorcpu;

    private String vendorname;

    private String vendorversion;

    @Column(name="\"VERSION\"")
    private String version;

    private String versioncpu;

    //bi-directional many-to-one association to EquipoSoft
    @OneToMany(mappedBy="equipo")
    private List<EquipoSoft> equipoSofts;

    //bi-directional many-to-one association to Inventario
    @OneToMany(mappedBy="equipo")
    private List<Inventario> inventarios;

    //bi-directional many-to-one association to Sesion
    @OneToMany(mappedBy="equipo")
    private List<Sesion> sesions;

    public Equipo() {
    }

    public long getId() {
        return this.id;
    }

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

    public BigDecimal getActivofijo() {
        return this.activofijo;
    }

    public void setActivofijo(BigDecimal activofijo) {
        this.activofijo = activofijo;
    }

    public String getArch() {
        return this.arch;
    }

    public void setArch(String arch) {
        this.arch = arch;
    }

    public String getEquipo() {
        return this.equipo;
    }

    public void setEquipo(String equipo) {
        this.equipo = equipo;
    }

    public String getHd() {
        return this.hd;
    }

    public void setHd(String hd) {
        this.hd = hd;
    }

    public String getMacaddr() {
        return this.macaddr;
    }

    public void setMacaddr(String macaddr) {
        this.macaddr = macaddr;
    }

    public String getModelo() {
        return this.modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNoseriecpu() {
        return this.noseriecpu;
    }

    public void setNoseriecpu(String noseriecpu) {
        this.noseriecpu = noseriecpu;
    }

    public String getNoseriemonitor() {
        return this.noseriemonitor;
    }

    public void setNoseriemonitor(String noseriemonitor) {
        this.noseriemonitor = noseriemonitor;
    }

    public String getNoserieraton() {
        return this.noserieraton;
    }

    public void setNoserieraton(String noserieraton) {
        this.noserieraton = noserieraton;
    }

    public String getNoserietecl() {
        return this.noserietecl;
    }

    public void setNoserietecl(String noserietecl) {
        this.noserietecl = noserietecl;
    }

    public String getPatchlevel() {
        return this.patchlevel;
    }

    public void setPatchlevel(String patchlevel) {
        this.patchlevel = patchlevel;
    }

    public String getRam() {
        return this.ram;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }

    public String getSo() {
        return this.so;
    }

    public void setSo(String so) {
        this.so = so;
    }

    public BigDecimal getStatus() {
        return this.status;
    }

    public void setStatus(BigDecimal status) {
        this.status = status;
    }

    public String getVendor() {
        return this.vendor;
    }

    public void setVendor(String vendor) {
        this.vendor = vendor;
    }

    public String getVendorcodename() {
        return this.vendorcodename;
    }

    public void setVendorcodename(String vendorcodename) {
        this.vendorcodename = vendorcodename;
    }

    public String getVendorcpu() {
        return this.vendorcpu;
    }

    public void setVendorcpu(String vendorcpu) {
        this.vendorcpu = vendorcpu;
    }

    public String getVendorname() {
        return this.vendorname;
    }

    public void setVendorname(String vendorname) {
        this.vendorname = vendorname;
    }

    public String getVendorversion() {
        return this.vendorversion;
    }

    public void setVendorversion(String vendorversion) {
        this.vendorversion = vendorversion;
    }

    public String getVersion() {
        return this.version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersioncpu() {
        return this.versioncpu;
    }

    public void setVersioncpu(String versioncpu) {
        this.versioncpu = versioncpu;
    }

    public List<EquipoSoft> getEquipoSofts() {
        return this.equipoSofts;
    }

    public void setEquipoSofts(List<EquipoSoft> equipoSofts) {
        this.equipoSofts = equipoSofts;
    }

    public EquipoSoft addEquipoSoft(EquipoSoft equipoSoft) {
        getEquipoSofts().add(equipoSoft);
        equipoSoft.setEquipo(this);

        return equipoSoft;
    }

    public EquipoSoft removeEquipoSoft(EquipoSoft equipoSoft) {
        getEquipoSofts().remove(equipoSoft);
        equipoSoft.setEquipo(null);

        return equipoSoft;
    }

    public List<Inventario> getInventarios() {
        return this.inventarios;
    }

    public void setInventarios(List<Inventario> inventarios) {
        this.inventarios = inventarios;
    }

    public Inventario addInventario(Inventario inventario) {
        getInventarios().add(inventario);
        inventario.setEquipo(this);

        return inventario;
    }

    public Inventario removeInventario(Inventario inventario) {
        getInventarios().remove(inventario);
        inventario.setEquipo(null);

        return inventario;
    }

    public List<Sesion> getSesions() {
        return this.sesions;
    }

    public void setSesions(List<Sesion> sesions) {
        this.sesions = sesions;
    }

    public Sesion addSesion(Sesion sesion) {
        getSesions().add(sesion);
        sesion.setEquipo(this);

        return sesion;
    }

    public Sesion removeSesion(Sesion sesion) {
        getSesions().remove(sesion);
        sesion.setEquipo(null);

        return sesion;
    }

}

This is the function where I create Equipo and Sesion这是我创建 Equipo 和 Sesion 的函数

public void  guardarsesion(String token,String matricula,Timestamp registro,int id_equipo) throws ParseException, UnknownHostException
    {


        int key = (int)UUID.randomUUID().getLeastSignificantBits();

        SessionBean = (SessionBeamRemote) new LookupGenerico<SessionBeamRemote>(
                SessionBeamRemote.class, "SessionBean").lookupImplementRemote();

        controladorEquipoRemote = (ControladorEquipoRemote) new LookupGenerico<ControladorEquipoRemote>(
                ControladorEquipoRemote.class, "ControladorEquipo").lookupImplementRemote();
        if (SessionBean != null) {
            UUID uuid = UUID.randomUUID();
            String randomUUIDString = uuid.toString();
            long idEquipo = buscarEquipo(GetSystemInfo.dar_mac());
            Equipo e = new Equipo();
            e = (Equipo) controladorEquipoRemote.ObtenerReferencia(idEquipo);
            System.out.println(controladorEquipoRemote.ObtenerReferencia(idEquipo));
            if(e == null){
                try {
                    GetSystemInfo.mostrar();
                    e = (Equipo) controladorEquipoRemote.ObtenerReferencia(idEquipo);
                } catch (SigarException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            frame_principal.setState(Frame.ICONIFIED);
            String mac = GetSystemInfo.dar_mac();

            System.out.println("agregando sesion");
            Sesion sesion = new Sesion();
            sesion.setId(randomUUIDString.toString().replace("-", ""));
            sesion.setRegistro(registro);
            sesion.setFin(null);
            sesion.setStatus(new BigDecimal(1));
            sesion.setFolioProf(new BigDecimal(3));
            sesion.setFolioAlumno(null);
            sesion.setMatricula(matricula);
            sesion.setIdHorario(new BigDecimal(1));
            sesion.setTokenusoft(token);
            sesion.setEquipo(e);    
            SessionBean.CrearSesion(sesion);

        }

    } 

Function ObtenerReferencia:函数 Obtener 参考:

@Override
    public Object ObtenerReferencia(long id) {
        return (Object)equipoFacadeLocal.getEM().getReference(Equipo.class, id);
    }

Function CrearSesion:函数创建会话:

@Override
    public void CrearSesion(Serializable sesion) {
        sesionFacade.crearSesion((Sesion) sesion); //This crearSesion contains only one sentence: entityManager.persist(sesion);
    }

I forgot about the error:我忘记了错误:

Error Code: 1
Call: INSERT INTO EQUIPO (ID, ACTIVOFIJO, ARCH, EQUIPO, HD, MACADDR, MODELO, NAME, NOSERIECPU, NOSERIEMONITOR, NOSERIERATON, NOSERIETECL, PATCHLEVEL, RAM, SO, STATUS, VENDOR, VENDORCODENAME, VENDORCPU, VENDORNAME, VENDORVERSION, "VERSION", VERSIONCPU) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [1, 100, arch, IVANPC, 1 TB, F0-76-1C-13-0B-83, Y50, IVANPC, 12345, 12345, 12345, 12345, 2, 8 GB, W10, 1, LENOVO, LENOVO, LENOVO, LENOVO, LENOVO, 2, 3]
Query: InsertObjectQuery(mx.profeti.sacs.model.entidades.Equipo@782b3322)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:745)
    at org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)
    at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:170)
    at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
    at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527)
    at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:511)
    at org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413)
    at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262)
    ... 32 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: restricción única (SACS.SYS_C0053869) violada

The problem is this:问题是这样的:

@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name="ID_EQUIPO")
private Equipo equipo;

Remove the cascade option: CascadeType.PERSIST , leaving the relation on your Sesion entity as this:删除级联选项: CascadeType.PERSIST ,将Sesion实体上的关系Sesion为:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_EQUIPO")
private Equipo equipo;

I Explain: CascadeType.PERSIST is used to cascade persist operations.我解释一下: CascadeType.PERSIST用于级联持久化操作。 So if you persist a Sesion Entity, the persist operation is propagated and the Equipo Entity is persisted also.因此,如果您持久化Sesion实体,则持久化操作将被传播并且Equipo实体也被持久化。 Since your Equipo entity is already persisted, a primary Key violation on the Equipo Table is thrown.由于您的Equipo实体已被持久化,因此会引发Equipo表上的主键违规。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM