hibernate复制数据库中一条记录

最近在用hibernate的时候产生一个问题。我的目的是复制一条记录。思路:从数据库中取得一条记录封装到对象中,然后改变此对象的主键,最后保存此对象。看似很正确的思路却产生了错误:identifier of the object was alter from 1 to 10。 这是为什么呢?开始从网上搜索,最终找到了原因:从数据库中取得的对象是持久化对象。在hibernate的缓存中有一个备份。当你修改了持久化对象,提交事务时,hibernate就会比较当前对象和在缓存中备份的对象,如果不一样则更新数据库。这里需要注意:更新是根据主键更新的:也就是 update tablename set ... where 主键=‘?’。 但是如果你把主键的值改了,hibernate在更新的时候就无法更新数据库了,所以就产生了上面的错误。 所以为了达到我的目的,持久化对象是不能修改的。怎么解决的,哭死冥想,终于解决了..而解决的办法有三种:解决办法一:evict(object) :在改变对象主键之前。利用evict方法清理hibernate缓存,此对象将不再是持久化对象,所以不会去更新数据库。成功。但是hibernate不提倡用此方法解决办法二:重新new一个对象,把原来的对象的属性值一一set进来,然后保存。重新new的对象是瞬时对象,保存成功。但如果存在大量的属性,或者此表存在子表数量多,那么必须为每个表的对象都new一次,然后赋值。这将很耗时,非常讨厌。解决办法三:利用java反射机制复制一个对象出来,效果的new一个对象一样,但是简单了很多,代码如下:public static Object copy(Object object) throws Exception {Class<?> classType = object.getClass();Object objectCopy = classType.getConstructor(new Class[] {}).newInstance(new Object[] {});Field fields[] = classType.getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];String fieldName = field.getName();String firstLetter = fieldName.substring(0, 1).toUpperCase();String getMethodName = "get" + firstLetter + fieldName.substring(1);String setMethodName = "set" + firstLetter + fieldName.substring(1);Method getMethod = classType.getMethod(getMethodName,new Class[] {});Method setMethod = classType.getMethod(setMethodName,new Class[] { field.getType() });Object value = getMethod.invoke(object, new Object[] {});setMethod.invoke(objectCopy, new Object[] { value });}return objectCopy;} 到此为止,问题解决....
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页