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;
}


}

阅读全文
2 0
原创粉丝点击