Как saveOrUpdate сравнивает данные в Hibernate - PullRequest
0 голосов
/ 08 ноября 2018

Я изучаю 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. Как происходит сравнение, поскольку мы не переопределили метод equals в Student pojo. Таблица содержит данные с:

id=101, name=abc, email=abc@gmail.com, marks=89

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

SaveorUpdate() работает на основе идентификатора.

Как hibernate обнаруживает, какие экземпляры старые, а какие новые?

Доступен ряд опций. Hibernate предполагает, что экземпляр является несохраненным временным экземпляром, если:

  • Свойство идентификатора равно нулю
  • Свойство Version или timestamp (если оно существует) имеет значение null
  • Новый экземпляр того же постоянного класса, созданный внутри hibernate, имеет то же значение идентификатора, что и данный экземпляр.
  • Вы указываете несохраненное значение в документе сопоставления класса, и значение свойства идентификатора совпадает.
  • Данные сущностей с таким же значением идентификатора отсутствуют в кэше второго уровня.
0 голосов
/ 08 ноября 2018

saveOrUpdate() не сравнивает объекты на основе равенства, оно сравнивает по идентификатору (столбцы @Id).

Из документов гибернации (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-makingpersistent):

saveOrUpdate () выполняет следующие действия:

если объект уже сохраняется в этом сеансе, ничего не делать

если другой объект, связанный с сеансом, имеет такой же идентификатор, выдается исключение

если объект не имеет свойства идентификатора, save () it

если идентификатор объекта имеет значение, присвоенное вновь созданному объекту, save () it

если объект версионирован с помощью или или значение свойства version совпадает со значением, присвоенным вновь созданному объекту, save () it

иначе обновить () объект

Итак, чтобы ответить на ваш вопрос, saveOrUpdate() НЕ сначала извлекает сущность из базы данных и сравнивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...