saveOrUpdate如何比较Hibernate中的数据

时间:2018-11-08 01:06:12

标签: hibernate

我正在学习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

谢谢。

2 个答案:

答案 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假定实例是未保存的临时实例:

  • 标识符属性为空
  • Version或timestamp属性(如果存在)为空
  • 由hibernate在内部创建的同一个持久类的新实例,其标识符值与给定实例相同。
  • 您在类的映射文档中提供了一个未保存的值,并且标识符属性的值匹配。
  • 具有相同标识符值的实体数据不在二级缓存中。