2013-04-09 46 views
0

我使用的检票,JPA + Hibernate的项目中检票链接自动坚持对象而AjaxLink不

我已经持久类这样

@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 

然后

我有刀实施粗砺操作

一种方法是

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

我的问题是,在wicketPage,如果我用一个Wicket链接,它的onclick方法执行以下操作

document.setState("someState"); 

它更新与出调用createDocument(文件)的值明确和数据库也跟上时代的

但是,如果使用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); 

任何人都可以指出为什么发生这种情况?

非常感谢

回答

0

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

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

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