JPA / Hibernate персистировать не работает - PullRequest
5 голосов
/ 29 мая 2009

Я использую JPA (реализация Hibernate) для сохранения объектов в базе данных. Выбор работает нормально, но по какой-то причине сохранение не работает. Я не получаю никаких ошибок, но база данных также не изменяется. Это касается как новых, так и существующих объектов.

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

Выход на консоль:

Opening DOA nl.compay.entities.CompayDAO@b124fa
Persisting: nl.compay.entities.EUser@1e2fe5d using nl.compay.entities.CompayDAO@b124fa
Persisting: nl.compay.entities.EUser@30b601 using nl.compay.entities.CompayDAO@b124fa
Persisting: nl.compay.entities.EPayment@ed3b53 using nl.compay.entities.CompayDAO@b124fa
Closing DOA nl.compay.entities.CompayDAO@b124fa

1010 * электронные платежи *

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

}

Ответы [ 4 ]

3 голосов
/ 28 января 2010

используйте @Transactional в вашем методе .....

@Transactional
public void save(Object ent){
.....
.....
}
3 голосов
/ 29 мая 2009

Как упоминал Шерканер, сохранение не приводит к ВСТАВКЕ или ОБНОВЛЕНИЮ напрямую. Вы должны очистить сеанс или - лучше, на мой взгляд, - закрыть единицу работы / совершить транзакцию. У вас есть транзакции?

1 голос
/ 29 мая 2009

Не думайте, что это ошибка в реализации Hibernate. Это желаемое поведение, вы хотели бы иметь минимальный обмен данными с базой данных, чтобы Hibernate (или любая хорошая платформа ORM) консолидировала все ваши изменения и сбрасывала их сразу .

1 голос
/ 29 мая 2009

Программа не должна сразу синхронизироваться с базой данных, вы пробовали this.em.flush(); где-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...