0

我在一个项目中使用 Wicket、JPA+Hibernate

我有这样的持久性课程

@Entity
@Table(name = "document", uniqueConstraints = { @UniqueConstraint(columnNames = {
    "name"}) })
public class Document
implements Serializable
{

private static final long serialVersionUID = 8496087166198616020L;

@Id
@GeneratedValue
private long id;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private String state;
.....
 Geter && setters

然后

我有用于 crud 操作的 dao 实现

一种方法是

@Override
@Transactional
public void createDocument(Document aDocument)
{
        entityManager.persist(aDocument);
}

我的问题是,在 wicketPage 中,如果我使用 Wicket Link 并且它的 onclick 方法执行以下操作

   document.setState("someState");

它在不专门调用 createDocument(document) 的情况下更新值,并且数据库也是最新的

但是如果我使用 AjaxLink 及其 onclick 方法

然后,我必须手动更新对象,否则数据库中的值将不会更新。我的修改应该如下:

@Override
@Transactional
public void createDocument(Document aDocument)
{
        if(aDocument.getId()==0{
        entityManager.persist(aDocument);
        }
       else{
          entityManager.merge(aDocument);           
}

然后要保存数据库中的更改,我必须首先更新状态和调用createDocument()方法。

         document.setState("someState");
         dao.createDocument(document);

谁能指出为什么会发生这种情况?

非常感谢

4

1 回答 1

0

您的数据库会话必须处于 AutoCommit 模式。当您使用Link“经典”时RequestCycle,它肯定会触发您的 OpenSessionInView 过滤器。这样,document您更新的对象仍由 管理Persistence Context,因此,底层 JPA 实现会自动将更改提交到数据库。

当您使用 时AjaxLink,您正在使用一个分离的实体,JPA 不会管理它,因此不会将其自动提交到数据库。当您调用您的createDocument方法时,您会将您的实体与您的实体合并Persistence Context并将其保存回来。

如果您不希望自动提交发生,您可以将 entityManager 的 FlushMode 设置为FlushMode.COMMIT

于 2013-04-10T07:37:35.423 回答