2009-05-29 11 views
5

Estoy usando JPA (implementación de Hibernate) para guardar objetos en la base de datos. Seleccionar funciona bien, pero por alguna razón, guardar no funciona. No obtengo ningún error, pero la base de datos tampoco se modifica. Esto se aplica tanto a las entidades nuevas como a las existentes.La persistencia de JPA/Hibernate no parece funcionar

EPayment pay = new EPayment(); 
    pay.setAmount(payment.getAmount()); 
    ... 
    pay.setUserByToUserId(receiver); 
    CompayDAO.get().save(pay); 

CompayDAO.save()

public void save(Object ent) { 
    System.out.println("Persisting: " + ent + " using " + this); 
    this.em.persist(ent); 
} 

consola de salida:

Opening DOA [email protected] 
Persisting: [email protected] using [email protected] 
Persisting: [email protected] using [email protected] 
Persisting: [email protected] using [email protected] 
Closing DOA [email protected] 

ePayment

package nl.compay.entities; 

// Generated 21-mei-2009 12:27:07 by Hibernate Tools 3.2.2.GA 

import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

/** 
* Payment generated by hbm2java 
*/ 
@Entity 
@Table(name = "payment", catalog = "compay") 
public class EPayment implements java.io.Serializable { 

    private static final long serialVersionUID = -2578493336948256566L; 

    private Integer id; 
    private EUser userByToUserId; 
    private EUser userByFromUserId; 
    private String description; 
    private float amount; 
    private String method; 
    private Date paydate; 

    public EPayment() { 
    } 

    public EPayment(EUser userByToUserId, EUser userByFromUserId, float amount, 
      Date paydate) { 
     this.userByToUserId = userByToUserId; 
     this.userByFromUserId = userByFromUserId; 
     this.amount = amount; 
     this.paydate = paydate; 
    } 

    public EPayment(EUser userByToUserId, EUser userByFromUserId, 
      String description, float amount, String method, Date paydate) { 
     this.userByToUserId = userByToUserId; 
     this.userByFromUserId = userByFromUserId; 
     this.description = description; 
     this.amount = amount; 
     this.method = method; 
     this.paydate = paydate; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    public Integer getId() { 
     return this.id; 
    } 

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

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "to_user_id", nullable = false) 
    public EUser getUserByToUserId() { 
     return this.userByToUserId; 
    } 

    public void setUserByToUserId(EUser userByToUserId) { 
     this.userByToUserId = userByToUserId; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "from_user_id", nullable = false) 
    public EUser getUserByFromUserId() { 
     return this.userByFromUserId; 
    } 

    public void setUserByFromUserId(EUser userByFromUserId) { 
     this.userByFromUserId = userByFromUserId; 
    } 

    @Column(name = "description", length = 1024) 
    public String getDescription() { 
     return this.description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Column(name = "amount", nullable = false, precision = 8) 
    public float getAmount() { 
     return this.amount; 
    } 

    public void setAmount(float amount) { 
     this.amount = amount; 
    } 

    @Column(name = "method", length = 50) 
    public String getMethod() { 
     return this.method; 
    } 

    public void setMethod(String method) { 
     this.method = method; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "paydate", nullable = false, length = 0) 
    public Date getPaydate() { 
     return this.paydate; 
    } 

    public void setPaydate(Date paydate) { 
     this.paydate = paydate; 
    } 

} 
+1

que se enfrentaron al mismo problema: Hibernate JPA + + Primavera. Insertar consulta se genera en los registros (lo que indica que flush() etc. ya estaba en su lugar). Intenté todo, incluida la confirmación de la transacción y otras sugerencias en la web. Y no sé cómo, pero una tabla drop-and-recrete en DB trabajó para mí. –

Respuesta

3

Como mencionó Sherkaner, un guardado no da como resultado un INSERTAR o ACTUALIZAR directamente. Tienes que enjuagar la sesión o, mejor en mi opinión, cerrar la unidad de trabajo/comprometer la transacción. ¿Tienes transacciones?

+0

Ver mi comentario @Sherkaner –

+0

Bueno, no soy un experto en JPA (solo uso de Hibernate + JPA Annotations + Spring), pero según el javadoc de EntityManager del método close(), la transacción aún está activa. Ver http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#close(). Así que todavía tiene que confirmar la transacción (por ejemplo, llamando a em.getTransaction(). Commit(), pero sugeriría alguna gestión de transacción declarativa. – rudolfson

1

El programa no tiene que sincronizar con la base de datos de inmediato , has probado this.em.flush(); ¿algun lado?

+0

No, pero lo hago em.close(). ¿Eso implica un color también, o significa que estoy tirando cosas? –

+0

em.close() no vacía automáticamente las cosas en la base de datos. Es mejor usar las transacciones (estoy de acuerdo con rudolfson) o usar em.flush() – Johan

1

No crea que esto sea un error en la implementación de Hibernate. Este es el comportamiento deseado, le gustaría tener una comunicación mínima con la base de datos para que Hibernate (o cualquier buen marco ORM) consolide todos sus cambios y elimine los cambios en uno ir.

+0

Nunca lo hice. Es un error conmigo;) –

3

uso @Transactional de su método .....

@Transactional 
public void save(Object ent){ 
..... 
..... 
} 
Cuestiones relacionadas