Ver Mensaje Individual
  #10 (permalink)  
Antiguo 22/04/2017, 21:04
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Guardar OneToMany Hibernate

Hola Tipdar y FuzzyLog en base a lo que me dijeron me salió esto:

Hibernate:
insert
into
ventas
(estId, SuId, artId, suId)
values
(?, ?, ?, ?)
abr 22, 2017 11:57:06 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1110, SQLState: 42000
abr 22, 2017 11:57:06 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Column 'suId' specified twice
abr 22, 2017 11:57:06 PM org.hibernate.engine.jdbc.batch.internal.AbstractB atchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
abr 22, 2017 11:57:06 PM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: could not execute statement]

Con eso descubrí el gran error porque mi tabla ventas tiene 2 claves primarias que a la vez son foráneas y otra foránea y no 4.

ventas(suId,artId,estId)

pero no sé cómo rayos solucionar esto xq había visto algo sobre clase embebidas para este tipo de tablas pero ahora eso es lo que me está complicando.

Código Java:
Ver original
  1. package app.model.entity;
  2. import app.contr.util.Conversiones;
  3. import java.io.Serializable;
  4. import java.util.*;
  5. import javax.persistence.*;
  6. import up.max.proyectpages.structs.PagesList;
  7. @Table(name = "subastas")
  8. @NamedQueries({
  9.     @NamedQuery(name = "subasta.findAll",query = "select s from Subasta s"),
  10.     @NamedQuery(name = "subasta.maxId",query = "select max(s.id)+1 from Subasta s"),
  11.     @NamedQuery(name = "subasta.search",query="select s from Subasta s "
  12.             + "where s.direccion.nombre like :criterio or s.subastador.ape1 like :criterio")
  13. })
  14. public class Subasta implements Serializable
  15. {
  16.     @Id
  17.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  18.     @Column(name = "suId")
  19.     private int id;
  20.     @Column(name = "suFecha")
  21.     private GregorianCalendar fecha;
  22.     @ManyToOne(cascade = CascadeType.ALL)
  23.     @JoinColumn(name = "dirId")
  24.     private Direccion direccion;
  25.     @ManyToOne(cascade = CascadeType.ALL)
  26.     @JoinColumn(name = "subId")
  27.     private Subastador subastador;
  28.     @OneToMany(mappedBy = "subasta",cascade = CascadeType.ALL)
  29.     private List<Venta>ventas;
  30.     public int getId() {
  31.         return id;
  32.     }
  33.     public void setId(int id) {
  34.         this.id = id;
  35.     }
  36.     public GregorianCalendar getFecha() {
  37.         return fecha;
  38.     }
  39.     public void setFecha(GregorianCalendar fecha) {
  40.         this.fecha = fecha;
  41.     }
  42.     public Direccion getDireccion() {
  43.         return direccion;
  44.     }
  45.     public void setDireccion(Direccion direccion) {
  46.         this.direccion = direccion;
  47.     }
  48.     public Subastador getSubastador() {
  49.         return subastador;
  50.     }
  51.     public void setSubastador(Subastador subastador) {
  52.         this.subastador = subastador;
  53.     }    
  54.     public void setVentas(List<Venta> ventas) {
  55.         this.ventas = ventas;
  56.     }
  57.     public PagesList<Venta>getVentas(){
  58.         PagesList<Venta>p = new PagesList(ventas);
  59.         return p;
  60.     }    
  61.     public void addVenta(Venta v){
  62.         ventas.add(v);
  63.     }
  64.     public void delVenta(Venta v){
  65.         ventas.remove(v);
  66.     }
  67.     public Subasta() { }
  68.     public Subasta(int id, GregorianCalendar fecha, Direccion xdireccion, Subastador xsubastador) {
  69.         this.id = id;
  70.         this.fecha = fecha;
  71.         this.direccion = xdireccion;
  72.         this.subastador = xsubastador;
  73.     }
  74.     @Override
  75.     public boolean equals(Object obj) {
  76.         if(obj instanceof Subasta){
  77.             Subasta objs = (Subasta)obj;
  78.             return objs.subastador.equals(this.subastador) && objs.fecha.equals(this.fecha);
  79.         } else {
  80.             return false;
  81.         }
  82.     }
  83.     @Override
  84.     public int hashCode() {
  85.         int hash = 17;
  86.         hash = 31 * hash + this.fecha.hashCode();
  87.         hash = 31 * hash + this.subastador.hashCode();
  88.         return hash;
  89.     }    
  90.     @Override
  91.     public String toString() {
  92.         return Conversiones.MostrarFechaYHora(fecha) + " -> " + direccion.toString();
  93.     }    
  94. }

Código Java:
Ver original
  1. package app.model.entity;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. import javax.persistence.*;
  5. @Table(name = "ventas")
  6. public class Venta implements Serializable
  7. {
  8.     @EmbeddedId
  9.     private VentaKey key;
  10.     @JoinColumns({
  11.         @JoinColumn(name = "SuId",referencedColumnName = "suId"),
  12.     })
  13.     @ManyToOne(cascade = CascadeType.ALL)
  14.     private Subasta subasta;
  15.     @ManyToOne(cascade = CascadeType.ALL)
  16.     @JoinColumn(name = "estId")
  17.     private Estado obje;
  18.     @OneToMany(cascade = CascadeType.ALL, mappedBy = "venta")    
  19.     private List<Registro>registros;
  20.     public Subasta getSubasta() {
  21.         return subasta;
  22.     }
  23.     public void setSubasta(Subasta subasta) {
  24.         this.subasta = subasta;
  25.     }
  26.     public VentaKey getKey() {
  27.         return key;
  28.     }
  29.     public void setKey(VentaKey key) {
  30.         this.key = key;
  31.     }    
  32.     public Estado getObje() {
  33.         return obje;
  34.     }
  35.     public void setObje(Estado obje) {
  36.         this.obje = obje;
  37.     }
  38.     public List<Registro> getRegistros() {
  39.         return registros;
  40.     }
  41.     public void setRegistros(List<Registro> registros) {
  42.         this.registros = registros;
  43.     }    
  44.     public Venta() { }        
  45.     public Venta(Subasta xobjs, Artefacto xobja, Estado obje) {
  46.         this.key = new VentaKey(xobjs,xobja);
  47.         this.subasta = xobjs;
  48.         this.obje = obje;
  49.     }    
  50.     @Override
  51.     public boolean equals(Object obj) {
  52.         if(obj instanceof Venta){
  53.             Venta v  =(Venta)obj;
  54.             return v.key.getObja() == this.key.getObja() && v.obje.equals(this.obje);
  55.         } else {
  56.             return false;
  57.         }
  58.     }
  59.     @Override
  60.     public int hashCode() {
  61.         int hash = 17;
  62.         hash = 31 * hash + this.key.getObja().hashCode();
  63.         hash = 31 * hash + this.obje.hashCode();
  64.         return hash;
  65.     }
  66.     @Override
  67.     public String toString() {
  68.         return this.key.getObja().getNombre() + " - estado: " + this.obje.getNombre();
  69.     }  
  70. }

Código Java:
Ver original
  1. package app.model.entity;
  2. import java.io.Serializable;
  3. import javax.persistence.*;
  4. @Embeddable
  5. public class VentaKey implements Serializable
  6. {
  7.     @ManyToOne(cascade = CascadeType.ALL)
  8.     @JoinColumn(name = "suId")
  9.     private Subasta subasta;
  10.     @ManyToOne(cascade = CascadeType.ALL)
  11.     @JoinColumn(name = "artId")
  12.     private Artefacto obja;
  13.     public Subasta getObjs(){
  14.         return subasta;
  15.     }
  16.     public void setObjs(Subasta objs) {
  17.         this.subasta = objs;
  18.     }
  19.     public Artefacto getObja() {
  20.         return obja;
  21.     }    
  22.     public void setObja(Artefacto obja) {
  23.         this.obja = obja;
  24.     }    
  25.     public VentaKey(){}
  26.     public VentaKey(Subasta xobjs, Artefacto xobja) {
  27.         this.subasta = xobjs;
  28.         this.obja = xobja;
  29.     }
  30.     @Override
  31.     public boolean equals(Object obj){
  32.         if(obj instanceof VentaKey){
  33.             VentaKey id =(VentaKey)obj;
  34.             return id.subasta.equals(this.subasta) && id.obja.equals(this.obja);
  35.         } else {
  36.             return false;
  37.         }
  38.     }
  39.     @Override
  40.     public int hashCode(){
  41.         int hash = 17;
  42.         hash = 31 * hash + this.subasta.hashCode();
  43.         hash = 31 * hash + this.obja.hashCode();
  44.         return hash;
  45.     }
  46. }

Lo peor de todo es que esto me hace replantear todo lo hecho hasta ahora, cómo resolverían esto??

Espero sus respuestas y Saludos.