Синхронизация Hibernate: - find() против createQuery()JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Синхронизация Hibernate: - find() против createQuery()

Сообщение Anonymous »

Сейчас я изучаю @Synchronize в Hibernate. Итак, в этом я столкнулся с проблемой. У меня есть два класса сущностей: Subject.java и RetieveSubject.java.
Subject.java

Код: Выделить всё

package org.example.bean;

import jakarta.persistence.*;
import jakarta.persistence.Table;
import lombok.Data;
import org.hibernate.annotations.*;

@Entity(name = "subject_entity")
@Table(name = "SUBJECTS",uniqueConstraints = @UniqueConstraint(columnNames = {"subjectName"}))
@Data
@DynamicInsert
@DynamicUpdate
public class Subject {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long subjectId;

String subjectName;
}

RetriveSubject.java

Код: Выделить всё

package org.example.bean;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;

@Entity(name="retrievesubject")
@Getter
@Subselect(value="select s.subjectId as sid ,s.subjectName as subname from tbl_subjects s")
@Synchronize(value={"TBL_SUBJECTS"},logical = false)
@Immutable
public class RetrieveSubject {

@Id
Long sid;
String subname;
}

Итак, в файле RetieveSubject.java это неизменяемый объект, который действует как представление, поэтому всякий раз, когда я запрашиваю объект RetieveSubject из Hibernate (используяentityManager.createQuery ()), он должен синхронизировать объект-субъект (имя таблицы: - TBL_SUBJECTS).
Теперь посмотрите код ниже: -

Код: Выделить всё

package org.example.service;

import jakarta.persistence.*;
import org.example.bean.RetrieveSubject;
import org.example.bean.Subject;

import java.util.List;
import java.util.Scanner;

public class SubjectService {
public static void main(String[] args) {

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Subject");
EntityManager entityManager = entityManagerFactory.createEntityManager();

Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of subjects:-");
int noofSubjects = sc.nextInt();
sc.nextLine();

String subjectName="";

for(int i=1; i  retrieveSubjectList = retrieveSubject.setParameter("id",4).getResultList();
for(RetrieveSubject retrieveSubject1 : retrieveSubjectList)
System.out.println(retrieveSubject1.getSid()+"----"+retrieveSubject1.getSubname());

entityTransaction.commit();
}
}
В приведенном выше коде я сначала получаю номер субъекта, затем имя субъекта, а затем сохраняю их в базе данных.
Пока все в порядке.< /p>
Теперь посмотрите следующие строки в приведенном выше коде: -

Код: Выделить всё

Subject randomSubject = entityManager.find(Subject.class,4);
System.out.println("randomSubjectName:-"+randomSubject.getSubjectName());
randomSubject.setSubjectName("Chemistry");
берём четвёртый предмет (значение первичного ключа – 4) и устанавливаем для параметра subjectName значение Химия.
После этого Я вызываю объектEntityManager.find(RetriveSubject.class,4), и результат (скажем, четвертый предмет, который я назвал физикой): -

Код: Выделить всё

Physics
Это нормально, поскольку find() не сбрасывает изменения перед выполнением.
Теперь после этого в следующих строках: -

Код: Выделить всё

 Query retrieveSubject = entityManager.createQuery("select r from retrievesubject r where r.sid=:id");
List< RetrieveSubject> retrieveSubjectList = retrieveSubject.setParameter("id",4).getResultList();
for(RetrieveSubject retrieveSubject1 : retrieveSubjectList)
System.out.println(retrieveSubject1.getSid()+"----"+retrieveSubject1.getSubname());
Я создаю запрос и пытаюсь получить четвертый объект, но здесь я также получаю выходные данные в виде физики. Но разве Chemistry не так ли??
Даже несмотря на то, что Hibernate сбрасывает изменения, вызывая приведенный ниже запрос на обновление перед запуском выбора: -

Код: Выделить всё

/* update
for org.example.bean.Subject */update TBL_SUBJECTS
set
subjectName=?
where
subjectId=?
Я получаю неправильный вывод.
Но если я прокомментирую строкуentityManager.find(RetieveSubject.class,4), а затем выполните код (предположим, я указал 4-е имя предмета как «Физика»), я получаю правильный результат как «Химия» после выполнения запроса.getResultList().
Кто-нибудь может сказать мне, почему происходит это несоответствие. Почему вывод отличается, когда присутствует find() + createQuery() и когда присутствует только createQuery()??

Подробнее здесь: https://stackoverflow.com/questions/791 ... reatequery
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Org.hibernate.Query невозможно преобразовать в org.hibernate.query.Query [javac] Запрос запроса = session.createQuery(sq
    Anonymous » » в форуме JAVA
    0 Ответы
    133 Просмотры
    Последнее сообщение Anonymous
  • Hibernate Envers — не записывает записи аудита для createQuery(...).executeUpdate(), только .persist() и .merge().
    Гость » » в форуме JAVA
    0 Ответы
    60 Просмотры
    Последнее сообщение Гость
  • Hibernate CreateQuery не работает с списком полей
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Hibernate CreateQuery не работает с списком полей
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Entity Framework savechanges () против savechangesasync () и find () против findasync ()
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»