检票链接自动坚持对象而AjaxLink不
问题描述:
我使用的检票,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);
任何人都可以指出为什么发生这种情况?
非常感谢
答
您的数据库会话必须处于AutoCommit模式。当您使用Link
时,会激发一个“经典”RequestCycle
,这肯定会触发您的OpenSessionInView过滤器。这样,更新的document
对象仍由Persistence Context
管理,因此底层的JPA实现会自动将更改提交到数据库。
当您使用AjaxLink
时,您使用的是分离的实体,JPA不管理它,因此不会自动将其交给数据库。当您拨打createDocument
方法时,您将您的实体与您的Persistence Context
合并并保存。
如果您不想让自动提交发生,您可以将您的entityManager的FlushMode设置为FlushMode.COMMIT