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; }
- 为什么建议避免外键上的单向一对多关联?
- Hibernate无法初始化代理 – 没有Session
- 如何配置maven hbm2hbmxml和hbm2java在mvn clean install中依次运行
- 创建bean’entalManagerFactory’时出错,嵌套HibernateException:无法获取默认的Bean Validation工厂
- 在hibernate中合并父节点后获取子ID
- 我可以使用带有beanvalidation的hibernate实体注释吗?
- 在删除和重新创建数据库之后强制Hibernate创建表
- com.mchange.v2.resourcepool.CannotAcquireResourceException:ResourcePool无法从其主工厂或源获取资源
- Hibernate – ServiceRegistryBuilder