hibernate 修改数据时,修改前的值与修改中的值的比较

2019-03-25 13:46|来源: 网路

我现在要对某条记录进行修改,在Serivce中,从action中传递过来了记录的实体,
如代码:
public void saveResource(Resc resource) {
//要进行分开,A->是新增资源,B->修改资源 两种情况在刷新缓存情况不同
boolean isNew = (resource.getResourceId() == null);
String path = "";

resourceDao.getSession().clear();
resourceDao.save(resource);
if(!isNew){
Resc resc = resourceDao.get(resource.getResourceId());
path = resc.getPath();
resourceDao.getSession().evict(resc);

}

         }

此处我想把数据表中要修改的记录中path这个字段值与正要修改的页面上传递过来的resource.getPath()进行比较

但是我得到的两个值都是相同的.其中数据表中的值与页面上的值不同,但是通过我的取值却是相同的,我该怎么处理?
如果resourceDao.getSession.evict(resource)取到的值到是不同了,但是我后面要用到resource中的roles集合,如果evict了会报异常



问题补充:
congjl2002 写道
我觉得你这个很有问题,你都已经执行了
resourceDao.save(resource); 然后再去查,怎么可能会不一样?这个改一下试试
public void saveResource(Resc resource) { 
//要进行分开,A->是新增资源,B->修改资源 两种情况在刷新缓存情况不同 
boolean isNew = (resource.getResourceId() == null); 
String pathA = resource.getPath(); 
String pathB = ""; 

resourceDao.getSession().clear(); 
resourceDao.save(resource); 
if(!isNew){ 
Resc resc = resourceDao.get(resource.getResourceId()); 
pathB = resc.getPath(); 
resourceDao.getSession().evict(resc); 

} 

         } 


我的action使用了prepareble接口,当service传递过来的resource对象已经是新的了.,你的代码pathA,pathB,都是一样的值,都是更改之后的值,取不到更改之前的值

问题补充:你说非常对,我现在改为这样了,先取值:
if(!isNew){
resourceDao.getSession().evict(resource);
Resc resc = resourceDao.get(rescId);
path = resc.getPath();
}
resourceDao.getSession().clear();
resourceDao.save(resource);
后使用就可以了.
ethen 写道
我有点没看懂,为啥先把resource的path值拿出来,然后再把resource整个保存到数据库里,之后调用get方法再把resource拿出来,最后把path值作比较,这中间就只有一个resource对象啊。
为啥要调用save呢?
如果要比较两个path,可以在save之前把数据库里面的path拿出来呀。然后再比较啊,正常逻辑不是这样么?


问题补充:不知道这样对不对?不过我已经实现了这种修改前与修改后的对比了.
要先驳离,然后再save
ethen 写道
我有点没看懂,为啥先把resource的path值拿出来,然后再把resource整个保存到数据库里,之后调用get方法再把resource拿出来,最后把path值作比较,这中间就只有一个resource对象啊。
为啥要调用save呢?
如果要比较两个path,可以在save之前把数据库里面的path拿出来呀。然后再比较啊,正常逻辑不是这样么?

相关问答

更多
  • Hibernate适用于大多数具有面向对象模型的应用程序。 所以你可以问:什么时候面向对象的模型是合适的? 我会说,最大的优势是开发人员的生产力。 查询性能本身通常比手工编码查询更差,因为它无法针对每个特定情况进行优化。 休眠通过使用缓存来很好地补偿这一点。 只写(大部分)系统不能从缓存中获得太多优势,甚至可能会降低性能(应该避免使用缓存)。 这些类型的系统通常不需要面向对象的模型,他们只是将数据推送到数据库中。 Hibernate is suitable for most of the applicati ...
  • liquibase-hibernate插件的当前文档位于https://github.com/liquibase/liquibase-hibernate/wiki 它可以让你比较你的hibernate模型和数据库,并创建和/或附加到更改日志,这样你就不需要手动编辑XML。 您从文档中发现了什么? The current documentation for the liquibase-hibernate plugin is at https://github.com/liquibase/liquibase-h ...
  • 信息太少,无法真正给出答案。 但有些要点检查: 您正在使用交易。 你准备好了吗? 也许在某些时候你的代码看不到变化,因为尚未提交(或者因为读取代码在另一个使用先前状态的事务中)。 缓存也可能是个问题。 要检查,您可以在每次更改DB(Session.flush())后显式刷新缓存。 这可能会降低性能,但可能会帮助您缩小问题范围。 Too little information to really give an answer. But some points to check: You are using tr ...
  • 如果你的系统如此动态以至于你不知道用户将要查询的表格,那么我看不到你将如何将这些表格映射到相应的POJO。 Hibernate的主要重点是将模式中的表映射到Java应用程序中的对象,主要通过Hibernate查询语言(HQL)或可用的其中一种程序化API。 但是,可以在hibernate中使用直接的SQL并返回非托管对象,但与使用HQL或查询API相比,它的能力受限得多。 为此,您可以使用类似于以下的代码: createSQLQuery( "SELECT * FROM someTable" ).addTra ...
  • HQL可以工作,cfquery中的基本SQL仍然可以正常工作。 Hibernate的优势在于不执行SUM()或AVG()等聚合函数,而是执行对象关系映射(ORM)。 HQL would work, basic SQL in cfquery would still work as well. The strength of Hibernate is not doing aggregated functions like SUM() or AVG(), but the Mapping of Object Rel ...
  • 这是一个奇怪的建议。 “不推荐”的建议意味着不使用只包含一个BoneCPConnectionProvider类的BoneCPConnectionProvider com.jolbox:bonecp-provider 。 如果你想在Hibernate中使用BoneCP,你将需要bonecp-provider因为它是hibernate.cfg.xml必需的配置属性: com.jolbox.bonecp.provider.Bon ...
  • 这取决于修改的性质。 如果通过在另一个线程中创建,持久化并将另一个实体与其关联来修改实体,那么它将无法工作,因为另一个实体实例将在第一个线程中被视为已分离。 抛开上面的用例,这应该在理论上有效,并且只有在不使用字节码检测进行脏检查时才有效。 Hibernate只需在需要刷新时检查对象是否脏了; 基本上,它并不关心你如何修改对象。 但是,不建议这样做。 首先,它可能与Hibernate / JPA的未来版本不兼容(可能存在更多限制阻止对实体的并发访问)。 其次,解决方法非常简单:只需为要同时修改的数据创建DT ...
  • 您必须将其添加到每个使用Property-Access的实体,并在方法签名之上添加@ManyToOne(fetch = FetchType.LAZY) 。 并添加序列号。 @Entity @Table(name = 'message') @Access(AccessType.PROPERTY) public class Message extends BusinessEntity { private static final long serialVersionUID = 1L; } @Entity ...
  • 编辑应该与您删除的方式类似。 首先你可以得到你要更新的Medecin对象: Medecin med = (Medecin) session.get(Medecin.class, idmed); med.setNom("Andrea"); //set new values of your columns 设置要更新的属性后: public Medecin updateMedecin(Medecin updatedObject) { log.info("********** Debut updateM ...
  • org.hibernate.common hibernate-commons-annotations 4.0.4.Final org.hibernate.common hibernate-commons-annotations