Wicket Link会自动保留Object,而AjaxLink则不会

时间:2013-04-09 19:29:08

标签: java hibernate jpa wicket

我在项目中使用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);

有人能指出为什么会这样吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

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