Java JPA/HibernatePersist似乎不起作用
我正在使用JPA(Hibernate实现)将对象保存到数据库中。选择很好,但由于某些原因,保存不起作用。我没有收到任何错误,但数据库也没有更改。这适用于新实体和现有实体Java JPA/HibernatePersist似乎不起作用,java,hibernate,jpa,Java,Hibernate,Jpa,我正在使用JPA(Hibernate实现)将对象保存到数据库中。选择很好,但由于某些原因,保存不起作用。我没有收到任何错误,但数据库也没有更改。这适用于新实体和现有实体 EPayment pay = new EPayment(); pay.setAmount(payment.getAmount()); ... pay.setUserByToUserId(receiver); CompayDAO.get().save(pay); CompayDAO.sav
EPayment pay = new EPayment();
pay.setAmount(payment.getAmount());
...
pay.setUserByToUserId(receiver);
CompayDAO.get().save(pay);
CompayDAO.save()
控制台输出:
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
电子支付
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;
}
}
该程序不必立即与数据库同步,您是否尝试过
this.em.flush()代码>某处?正如Sherkaner提到的,保存不会直接导致插入或更新。您必须刷新会话,或者——在我看来更好——关闭工作单元/提交事务。您确实有事务吗?不要认为这是Hibernate实现中的错误。这是需要的行为,您希望与数据库的通信最少,这样Hibernate(或任何好的ORM框架)将整合所有更改并一次性刷新您的更改。在您的方法上使用@Transactional
@Transactional
public void save(Object ent){
.....
.....
}
没有,但我有。关闭()。这是否也意味着刷新,还是意味着我要扔掉东西?em.close()不会自动将东西刷新到数据库中。更好地使用事务(我同意rudolfson)或em.flush()嗯,我不是JPA专家(只是使用Hibernate+JPA Annotations+Spring),但根据EntityManager的javadoc of the close()方法,事务仍然是活动的。看见因此,您仍然必须提交事务(例如,通过调用em.getTransaction().commit(),但我建议使用声明式事务管理。我从来没有这样做过。这是我的一个错误;)我面临相同的问题:Hibernate+JPA+Spring。在日志中生成Insert查询(指示flush()等已就位)。尝试了一切,包括在web上提交事务和其他建议。我不知道如何,但一个表删除和重新创建在数据库级别的工作对我来说。
@Transactional
public void save(Object ent){
.....
.....
}