Spring,Hibernate和JPA:在entitymanager上调用persist似乎没有提交数据库

我正在尝试使用Hibernate和JPA设置Spring,但是当尝试持久化对象时,似乎没有任何东西添加到数据库中。

使用以下内容:

                         

在AccountManager中,我正在做:

 @Repository public class AccountManager implements IAccountManager { @PersistenceContext private EntityManager em; /* -- 8< -- Query methods omitted -- 8< -- */ public Account storeAccount(Account ac) { ac = em.merge(ac); em.persist(ac); return ac; } } 

交流来自:

  Account ac = new Account(); ac.setId(mostRecent.getId()+1); ac.setUser(user); ac.setName(accName); ac.setDate(new Date()); ac.setValue(0); ac = accountManager.storeAccount(ac); return ac; 

有没有人可以指出我做错了什么? 持久调用返回而不抛出exception。 如果之后我做em.contains(ac) ,则返回true。

如果有人需要,这里是如何定义帐户:

 @SuppressWarnings("serial") @Entity @NamedQueries({ @NamedQuery(name = "Account.AllAccounts", query = "SELECT a FROM Account a"), @NamedQuery(name = "Account.Accounts4User", query = "SELECT a FROM Account a WHERE user=:user"), @NamedQuery(name = "Account.Account4Name", query = "SELECT a FROM Account a WHERE name=:name"), @NamedQuery(name = "Account.MaxId", query = "SELECT MAX(a.id) FROM Account a"), @NamedQuery(name = "Account.Account4Id", query = "SELECT a FROM Account a WHERE id=:id"), }) public class Account extends AbstractNamedDomain { @Temporal(TemporalType.DATE) @Column(name = "xdate") private Date date; private double value; @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name="userid") private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER) @OrderBy("date") private List accountActivity = new ArrayList(); public List getAccountActivity() { return accountActivity; } public void setAccountActivity(List accountActivity) { this.accountActivity = accountActivity; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public double getValue() { return value; } public void setValue(double value) { this.value = value; } public void addAccountActivity(AccountActivity activity) { // Make sure ordering is maintained, JPA only does this on loading int i = 0; while (i < getAccountActivity().size()) { if (getAccountActivity().get(i).getDate().compareTo(activity.getDate()) <= 0) break; i++; } getAccountActivity().add(i, activity); } } @MappedSuperclass public abstract class AbstractNamedDomain extends AbstractDomain { private String name; public AbstractNamedDomain() { } public AbstractNamedDomain(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @MappedSuperclass public abstract class AbstractDomain implements Serializable { @Id @GeneratedValue private long id = NEW_ID; public static long NEW_ID = -1; public long getId() { return id; } public void setId(long id) { this.id = id; } public boolean isNew() { return id==NEW_ID; } } 

感谢eric和Juan Manuel的回答,我能够弄清楚交易没有得到承诺。

将@Transactional添加到storeAccount方法就可以了!

我实际上遇到过这种可能发生的另一种方式。

在注入的EntityManager中,如果您具有如下指定的persistence.xml,则不会发生任何更新:

您需要删除transaction-type属性,并使用默认值JTA。

您没有明确需要调用persist方法。 合并操作会在提交时将更改写入DB。

可能你保持事务处于活动状态,并且在运行支持活动事务的其他方法结束之前它不会调用“commit”(所有“投票”表示提交而没有表示回滚。)

如果你确定你要坚持的实体是好的,你可能会这样做:

 @TransactionManagement(TransactionManagementType.BEAN) public class AccountManager implements IAccountManager { ..} 

并管理您的实体持久性添加:

 @Resource private SessionContext sessionContext; public Account storeAccount(Account ac) { sessionContext.getUserTransaction().begin(); ac = em.merge(ac); em.persist(ac); sessionContext.getUserTransaction().commit(); return ac; }