我正在学习Hibernate(这里是初学者)。我想知道saveOrUpdate方法如何比较表中的记录和处于暂态状态的对象中的数据。
示例代码段:
package com.crudoperations;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import com.beans.Student;
public class CRUDMain {
public static void main(String[] args) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
ServiceRegistryBuilder service = new ServiceRegistryBuilder();
ServiceRegistry sRegitry = service.applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sf = cfg.buildSessionFactory(sRegitry);
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Student stud = new Student();
stud.setId(101);
stud.setSname("abc");
stud.setEmail("abc@gmail.com");
stud.setMarks(89);
// System.out.println("invoking save() method.");
// int pk = (Integer) session.save(stud);
// System.out.println("PK:"+pk);
System.out.println("invoking saveOrUpdate() method.");
session.saveOrUpdate(stud);
tx.commit();
}
};
package com.beans;
public class Student {
private int id;
private String sname;
private String email;
private int marks;
public Student() { }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
}
我已经阅读到,使用saveOrUpdate()首先从数据库中选择记录,然后将所选数据与stud对象中的数据进行比较。如果不匹配,则不会插入,但如果不匹配,则将插入stud对象中的数据。由于我们还没有覆盖Student pojo中的equals方法,因此如何进行比较。表格包含以下数据:
id=101, name=abc, email=abc@gmail.com, marks=89
谢谢。
答案 0 :(得分:0)
saveOrUpdate()
does not compare objects based on equality, it compares on the identifier (@Id column(s)).
From hibernate docs ( http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-makingpersistent)以单一形式发布不同的数据:
saveOrUpdate()执行以下操作:
如果对象在此会话中已经存在,则不执行任何操作
如果与会话相关联的另一个对象具有相同的标识符,则引发异常
如果对象没有标识符属性,请保存()
如果对象的标识符具有分配给新实例化的对象的值,则将其保存()
如果对象使用或进行版本控制,并且version属性值与分配给新实例化的对象的值相同,则将其保存()
否则update()对象
因此,要回答您的问题,saveOrUpdate()
不会首先从数据库中获取实体并进行比较。
答案 1 :(得分:0)
SaveorUpdate()
基于标识符起作用。
休眠如何检测哪些实例是旧实例,哪些是新实例?
一系列选项可用。在以下情况下,Hibernate假定实例是未保存的临时实例: