最近我很惊讶地了解到,如果只进行了一次更改并调用了merge,则默认的休眠行为是更新对象中的所有字段。
动态更新字段允许您配置仅更新已更改字段的替代方法...
http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
我在Hibernate中使用JPA,并尝试添加以下内容
@javax.persistence.Entity
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true)
到我的类(以前它只有JPA注解)
无论如何,我一直在监视sql,不幸的是它没有改变它,我仍然看到每个字段更新。
这是我的java更新对象...
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void setAccountStatusForUser(String username, AccountStatus act){
User u = this.getUser(username);
u.setAccountStatus(act);
this.update(u);
}
并且更新方法执行以下操作:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public Object update(Object o) {
Object a = this.entityManager.merge(o);
this.entityManager.flush();
return a;
}
如有任何帮助,我们将不胜感激。
3条答案
按热度按时间jxct1oxe1#
一些问题对您有帮助:
getUser()
方法是如何工作的?分离的对象不与任何原始版本相关联,这就是单词 detached 的由来。这有助于Hibernate进行任何比较,从而强制它进行完全升级。
正如我在Springsource Forum上看到的,只有当
select-before-update
选项被设置为true
时,它才能工作,这看起来很合乎逻辑,因为Hibernate必须现在实际上改变了什么。select-before-update
选项强制它读取原始文件。如果您的应用程序完全从数据库中读取
User
,并且不处理分离的对象,那么我无法提供更多的帮助...ngynwnxp2#
从休眠文档中:
一定要导入@javax.persistence.Entity来标记一个类为实体。
oyxsuwqo3#
你通过调用merger()重新附加一个分离的对象。在这种情况下,你必须打开selectBeforeUpdate。这在javadocs中。