我在项目中使用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);
有人能指出为什么会这样吗?
非常感谢
答案 0 :(得分:0)
您的数据库会话必须处于AutoCommit模式。当您使用Link
时,会触发“经典”RequestCycle
,这肯定会触发您的OpenSessionInView过滤器。这样,您更新的document
对象仍然由Persistence Context
管理,因此,基础JPA实现会自动将更改提交到数据库。
当您使用AjaxLink
时,您正在使用分离的实体,JPA不管理它,因此不会将其自动提交到数据库。当您拨打createDocument
方法时,将实体与Persistence Context
合并并保存回来。
如果您不希望自动提交发生,可以将entityManager的FlushMode设置为FlushMode.COMMIT