hibernate中session中的update方法,改动了一下,让数据库中原有的属性不变,只更新传入对象中改动的属性
来源:互联网 发布:mac pro 2016电池容量 编辑:程序博客网 时间:2024/05/22 03:18
初学hibernate,遇到一个问题也是众所周知的,update传入一个对象,如果对象中没有你不需要改动的属性值,它会把数据库原有的对象属性值变为null。
比如数据里有一行,id=1、username=“rose”、password=“123456”;
而你只想更新一个password属性值 User user = new user(1,“123456”);
(这只是有三个属性,如果有好多,你只set了一个主键和一个你想改动的属性值)
但如果你update(user)这样你数据库里的username就变为null了。
下面就是我的解决方案,我写的只是注重了结果,效率优化可能很差。有点乱。
此方法只是针对于update,可能我以后还会学到更好的方法。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.DaShenBuGuoHe.dao.HiberUtils;
public class Demo {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
// test();
User user = new User();
user.setUsername("rose");
updateObj(2, user);
}
//更新的方法
public static void updateObj(int id, Object object) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
Object oldObj = getObj(id, object.getClass());
valuation(oldObj, object);
Session session = HiberUtils.getSession();
Transaction transaction = session.beginTransaction();
session.update(object);
transaction.commit();
session.close();
}
//得到数据库对象原有的属性
private static Object getObj(int id, Class objClass) {
Session session = HiberUtils.getSession();
Object oldObj = session.get(objClass, id);
session.close();
return oldObj;
}
//测试新旧对象赋值是否正确
private static void test() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
NoSuchMethodException, SecurityException {
User user = new User();
user.setUsername("coco");
user.setPassword("123456");
User userTemp = new User();
valuation(user, userTemp);
System.out.println(userTemp);
}
//通过一个get方法得到的返回值类型,和方法名推出这个属性的set方法
public static Method getSetMethod(Class class1, String name, Class class2)
throws NoSuchMethodException, SecurityException {
name = name.substring(0, name.indexOf("("));
name = "set" + name.substring(3);
return class1.getMethod(name, class2);
}
//这个方法是主要了,用 旧的对象 给 新的对象 空的属性值 进行赋值
public static void valuation(Object oldObj, Object newObj) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
if (newObj.getClass() != oldObj.getClass()) {
System.out.println("出错了");
return;
}
Method[] methods = newObj.getClass().getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String str = method.toString();
str = str.substring(str.lastIndexOf(".") + 1);
if (str.startsWith("get")) {
if (str.startsWith("getClass")) {
break;
}
//肯定要在新对象属性值为null 且旧对象这个属性值不为null的情况下 才需要赋值
Object object = method.invoke(newObj);
if (object == null) {
Object object2 = method.invoke(oldObj);
if (object2 != null) {
Class<?> returnType = method.getReturnType();
Method setMethod = getSetMethod(newObj.getClass(), str, returnType);
setMethod.invoke(newObj, object2);
}
}
}
}
}
}
// user 类
public class User implements java.io.Serializable {
private Integer uid;
private String username;
private String password;
private String role;
private String lasttime;
private String extends1;
private String extends2;
private String extends3;
public User() {
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", role=" + role
+ ", lasttime=" + lasttime + "]";
}
public Integer getUid() {
return this.uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return this.role;
}
public void setRole(String role) {
this.role = role;
}
public String getLasttime() {
return this.lasttime;
}
public void setLasttime(String lasttime) {
this.lasttime = lasttime;
}
public String getExtends1() {
return this.extends1;
}
public void setExtends1(String extends1) {
this.extends1 = extends1;
}
public String getExtends2() {
return this.extends2;
}
public void setExtends2(String extends2) {
this.extends2 = extends2;
}
public String getExtends3() {
return this.extends3;
}
public void setExtends3(String extends3) {
this.extends3 = extends3;
}
}
- hibernate中session中的update方法,改动了一下,让数据库中原有的属性不变,只更新传入对象中改动的属性
- 如何跟踪检查数据库中对象的改动
- hibernate 只更新修改了的属性。
- 改动了一下
- 改动了一下的堆排序
- hibernate中的update方法只更新部分字段的方法
- TMS中Struts的改动
- python2.x中函数在python3.x中的改动方法
- python2.x中函数在python3.x中的改动方法
- Hibernate中更新数据的update方法
- Qt中解决中文乱码的方法 (有改动)
- 同一类一个对象属性赋值到另一个对象的属性,前者存在的替换,不存在的不做改动
- 呵呵,改动了一下我的blog模板
- hibernate的session对象中save()和update()方法的区别
- TMS2.0中对DBUtil的改动
- symbian中CSmsSettings几个函数的改动
- python3中map函数的改动
- Qt5 中关于信号槽的改动
- SVMtrain的参数c和g的优化
- jieba分词
- 关于String s = new String("abc")的知识
- 什么是时钟周期?什么是机器周期?什么是指令周期?
- Hibernate5.2.5的配置
- hibernate中session中的update方法,改动了一下,让数据库中原有的属性不变,只更新传入对象中改动的属性
- synchronized 修饰的方法无法实现互斥的问题解决
- UE4引擎学习笔记:Blueprints Visual Scripting->Basic Scripting
- Android OPenGL 初体验
- 手把手带你撸一套Android简易ORM框架
- web服务器接口返回参数有null值
- ES6中的export、import、export default详解
- 从二分类到多分类的迁移策略
- js中使用background-size等带“-”的css样式