2009-05-29 27 views
5

Używam JPA (implementacja Hibernate) do zapisywania obiektów w bazie danych. Wybór działa dobrze, ale z jakiegoś powodu zapisywanie nie działa. Nie dostaję żadnych błędów, ale baza danych również się nie zmienia. Dotyczy to zarówno nowych, jak i już istniejących.Węzeł JPA/Hibernate nie działa.

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

Console wyjście:

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] 

systemów płatniczych

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

I w obliczu tego samego problemu: hibernacji + WZP + sprężyna. Wstawianie kwerendy generowane w dziennikach (wskazujące, że flush() etc był już na miejscu). Próbowałem wszystkiego, łącznie z zatwierdzaniem transakcji i innymi sugestiami w internecie. I nie wiem jak, ale stół do dropowania i odtwarzania na poziomie DB pracował dla mnie. –

Odpowiedz

3

Jak wspomniano Sherkaner, zapisywania nie powoduje INSERT lub UPDATE bezpośrednio. Musisz opróżnić sesję lub - lepiej moim zdaniem - zamknąć jednostkę pracy/zatwierdzić transakcję. Masz transakcje?

+0

Zobacz mój komentarz @Sherkaner –

+0

Cóż, nie jestem ekspertem WZP (tylko przy użyciu Hibernuj + Adnotacje JPA + Spring), ale zgodnie z javadoc EntityManager metody close(), transakcja jest nadal żywa. Zobacz http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#close(). Nadal musisz zatwierdzić transakcję (np. Wywołując em.getTransaction(). Commit(), ale sugerowałbym pewne deklaratywne zarządzanie transakcjami – rudolfson

1

Program nie mają być synchronizowane z bazą danych od razu , czy próbowałeś this.em.flush(); gdzieś?

+0

Nie, ale robię em.close(). Czy to też oznacza kolor, czy to znaczy, że rzucam coś? –

+0

em.close() nie powoduje automatycznego opróżniania rzeczy do bazy danych. Lepiej używać transakcji (zgadzam się z rudolfsonem) lub użyć em.flush() – Johan

1

Nie myśl, że to błąd w implementacji Hibernacji. Jest to pożądane zachowanie, chcesz mieć minimalną komunikację z bazą danych, więc Hibernate (lub jakakolwiek dobra struktura ORM) skonsoliduje wszystkie twoje zmiany i wypróżni twoje zmiany w jednym udać się.

+0

Nigdy tego nie zrobiłem To błąd ze mną;) –

3

użycie @Transactional od metody .....

@Transactional 
public void save(Object ent){ 
..... 
..... 
} 
Powiązane problemy