2016-09-09 19 views
1

私は2つのクラスを持っています:EquipoとSesion。 Sesionには、ManyToOneの関係を持つEquipo equipoが1つ含まれています。JavaでManyToOne関係を持つエンティティを維持する

私は新しいSesionを保持したい場合は、私は次のようにします。

1.-私はSesionを作成します。

2.-私はEQUIPO

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

3.-への参照を取得し、私は最後に、私は新しいSesionを持続

sesion.setEquipo(e); 

4.- SesionのEQUIPOを設定します。

entityManager.persist(sesion); 

しかし、毎回私は、エンティティ・マネージャがテーブルの上に新しいレコードとしてEQUIPOを保存するだけではなくsesionにそれをasociateしようとしていると思いますので、私は独自のルールに違反するというエラーを取得します。

何が起こっているのか分かりませんか?

Sesionクラス:

@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クラス:

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

} 

これは私が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); 

     } 

    } 

機能ObtenerReferenciaを作成する機能です

機能CrearSesion:

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

私はエラーを忘れてしまった:

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.enti[email protected]) 
    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 
+0

私たちが手助けできるようにコードを投稿してください。 – lsiva

+0

あなたのSesionエンティティクラスコードを投稿してください。恐らく間違った注釈を使用している可能性があります –

+0

参照を取得すると、エンティティがDBにアタッチされているために必要な変更を加えることができるので、DBは自動的に更新されます。設定が終わったら、 'commit()'を呼び出します。 –

答えて

1

は、問題はこれです:上の関係を残し、CascadeType.PERSIST

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

は、CASCADEオプションを削除この場合のSesionエンティティ:

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

説明:CascadeType.PERSISTは、持続操作をカスケードするために使用されます。したがって、Sesionエンティティを永続化すると、持続操作が伝播され、Equipoエンティティも永続化されます。 Equipoエンティティはすでに永続化されているため、Equipoテーブルの主キー違反がスローされます。

+0

おっと、私はそれが理にかなっています。私は変更を行い、それは働いた。私はEquipoが新しいのであれば、まず手動でそれを正しく維持しなければならないと思いますか?どうもありがとうございます! – IvnBam

+0

@IvnBam、問題ありません。私の答えを投票し、それを正解としてください。 –

関連する問題