hibernate修改对象

woainilxt 2009-03-26 02:21:56
假如有一个对象A,有1000个属性。
现在我需要修改其中500个,其余不变.(webwork+hibernate)
比如说页面提交上来A.1, A.2, A.3, A.4, ........A.500;
直接 update(A)的话,其余属性就null了,
但如果读出数据库中的A,再根据页面的值,依次赋值的话要set500次,请问该如何处理这种情况啊?
...全文
570 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
重返春季 2010-03-30
  • 打赏
  • 举报
回复
回答很简单:用BeanUtil。我们就是用这个。就是复制一个对象的属性给另外一个对象。
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。


原文链接:http://www.matrix.org.cn/thread.shtml?topicId=29454&forumId=17
BeanUtils简读本

一、简介:

BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、用法:

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

public static void copyProperties(java.lang.Object dest,java.lang.Object orig)   
throws java.lang.IllegalAccessException,
java.lang.reflect.InvocationTargetException

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到TeacherForm   
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:
teacher.setModifyDate(new Date());
w342229068 2010-03-30
  • 打赏
  • 举报
回复
有500个字段的表吗
woainilxt 2009-03-31
  • 打赏
  • 举报
回复
不知道有人比较懂webwork没?
可不可以这样?
利用webwork拦截器,先自定义个拦截器,偷偷传一个ID过去,把数据库的对象load出来。
再把页面的A.1-A.500通过其他拦截器赋值到刚load出来的对象里面。
这样就达到我要的效果了,但对webwork不熟悉不知道具体怎么弄,有没有人来解惑啊!!
Landor2004 2009-03-31
  • 打赏
  • 举报
回复
update的时候确实要在同一session中,insert没有这种限制,
所以可以先delete
再insert

或者直接写hql吧
woainilxt 2009-03-30
  • 打赏
  • 举报
回复
hibernate默认的是初始化的时候生成静态的sql语句,也就是说不管你想修改几个字段,hibernate生成的sql语句都是所有字段的新增或者修改
不过可以通过配置文件修改
<class dynamic-insert="true" dynamic-update="true"......
这样就会动态生成hibernate的sql语句,为null的不会再sql中出现
要在同一session才能做到,而跨seesion要用merge,不做到具体怎么做法?
fenglingcompany 2009-03-29
  • 打赏
  • 举报
回复
先把该记录查出来,在update

hibernate 中的get与update方法
后海 2009-03-28
  • 打赏
  • 举报
回复

正如上边朋友所言,

对于上诉问题,Hibernate 提供了自身的数据库操作语言 (HOL) [Hibernate Query Lanage],是一种基于SQL的
持久化方案 !

你可以试试 哦 !
一师兄 2009-03-27
  • 打赏
  • 举报
回复
表设计有问题,怎么会500个字段?
Landor2004 2009-03-27
  • 打赏
  • 举报
回复
hibernate默认的是初始化的时候生成静态的sql语句,也就是说不管你想修改几个字段,hibernate生成的sql语句都是所有字段的新增或者修改
不过可以通过配置文件修改
<class dynamic-insert="true" dynamic-update="true"......
这样就会动态生成hibernate的sql语句,为null的不会再sql中出现
聪头 2009-03-27
  • 打赏
  • 举报
回复
同意5楼说法
woainilxt 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 java2000_net 的回复:]
1 如果页面提交过来的是500个字段,那么你只需要根据它来处理,也就是说提交的页面应该包含要更新的属性名和数值
2 依次赋值的话要set500次
如果你想手工做,那么岂不是要累死。
有2个方法
1 java提供了反射机制,你可以根据提交的属性名去匹配类的属性并赋值
2 有一些工具可以替你完成这个,比如BeanUtil,
给你一个例子,自己看看吧,
BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试…
[/Quote]

有点误会,500个只是个假设,就是说数据字段很多,由于webwork拦截器的存在,我已经拿到了页面穿过来的500个属性字段并放在了一个对象里面。我要问了是剩下其余500属性应该怎么处理,因为不是页面提交过来的属性我不想改。
我现在知道两方法 1.这500个不想改的属性在页面提交的时候hidden过来,update
2.读出在数据库中的要修改的对象,依次根据页面提交赋值,update当前对象
可是,不管上面那种方法处理量都很大。我想问的是有没有更好的处理办法
daisycool 2009-03-27
  • 打赏
  • 举报
回复
支持反射机制
老紫竹 2009-03-27
  • 打赏
  • 举报
回复
1 如果页面提交过来的是500个字段,那么你只需要根据它来处理,也就是说提交的页面应该包含要更新的属性名和数值
2 依次赋值的话要set500次
如果你想手工做,那么岂不是要累死。
有2个方法
1 java提供了反射机制,你可以根据提交的属性名去匹配类的属性并赋值
2 有一些工具可以替你完成这个,比如BeanUtil,
给你一个例子,自己看看吧,
BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试


3 500个字段,我认为已经超过sql允许的长度了,可能需要....

我还没想清楚该怎么做,也许得手工拆分成2个类,呵呵!



[img=http://www.java2000.net/images/company/www.java2000.net.gif]提供最全面最实用的Java面试题,智力面试题,面试技巧,JAVA自测题,Java代码,Java项目,Java学习资料,JAR下载[/img]
gordonkkk 2009-03-27
  • 打赏
  • 举报
回复
如果字段真的很多,那么用hibernate的update或merge方法会很不划算吧,因为它生成的sql语句是包含全部字段的。
所以首选考虑应该用sql,也就是createSQLQuery。你可以写一个静态方法,生成这个sql。
如果你的数据对象是普通POJO的话,方法可以这样写:
用一个Map存放要更新的字段,用getDeclaredMethods得到Methods数组,遍历之。如果方法名以get开头,就把对应的字段作为key,取得的值作为value,放在Map里,最后根据Map生成SQL语句。
woainilxt 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Landor2004 的回复:]
hibernate默认的是初始化的时候生成静态的sql语句,也就是说不管你想修改几个字段,hibernate生成的sql语句都是所有字段的新增或者修改
不过可以通过配置文件修改
<class dynamic-insert="true" dynamic-update="true"......
这样就会动态生成hibernate的sql语句,为null的不会再sql中出现
[/Quote]
试了,没成功.....................
woainilxt 2009-03-27
  • 打赏
  • 举报
回复
晕死,比喻不行啊
yjaqktpp 2009-03-26
  • 打赏
  • 举报
回复
不能直接update(),
你得先load(A),或者get(A)
然后依次setA的属性....
hchen2008 2009-03-26
  • 打赏
  • 举报
回复
学习
zidasine 2009-03-26
  • 打赏
  • 举报
回复
那就先查出来再对改动的属性重新赋值
woainilxt 2009-03-26
  • 打赏
  • 举报
回复
隐藏500个?
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧