Получение списка сущностей с идентификаторами в Hibernate 5.3 - PullRequest
0 голосов
/ 03 октября 2018

Я только начал использовать Hibernate, и я использую его для создания RESTful API с Джерси.

Чтобы привыкнуть к Hibernate, я пытаюсь реализовать операции CRUD для этой сущности (Для удобства я исключил геттеры, сеттеры и аннотации:

public class People  implements java.io.Serializable {

 private Integer id;
 private String name;
 private String surname;
 private String phone;
 private String email;
 private String dui;
 private String address;
 private Boolean state;
 private Set userses = new HashSet(0);

 public People() {
 }


 public People(String name, String surname, String phone, String email, String dui, String address) {
    this.name = name;
    this.surname = surname;
    this.phone = phone;
    this.email = email;
    this.dui = dui;
    this.address = address;
 }
 public People(String name, String surname, String phone, String email, String dui, String address, Boolean state, Set userses) {
   this.name = name;
   this.surname = surname;
   this.phone = phone;
   this.email = email;
   this.dui = dui;
   this.address = address;
   this.state = state;
   this.userses = userses;
 }

}

Поскольку я хочу получить список записей для этой сущности, но НЕ для ее дочерних элементов (пользователей в этом случае [да, я знаю, чтополе имеет забавное имя]), я выбираю список, используя конструктор сущности:

  SessionFactory sesFact = HibernateUtil.getSessionFactory();
  Session ses = sesFact.openSession();
  Transaction tra = null;
  tra = ses.beginTransaction();
  String queryString = "SELECT new People(p.name, p.surname, p.phone, p.email, p.dui, p.address) FROM People p";
  Query query = ses.createQuery(queryString, People.class);
  List<People> people = query.list();

Проблема с этим подходом состоит в том, что я получаю список сущностей БЕЗ их соответствующих идентификаторов, и янужно, чтобы они были в возвращаемом списке (... Если только у Hibernate нет особой причины не делать этого, о чем я не знаю. Если есть такая вещь, я буду благодарен, если вы укажете на это).

Итак, каков наилучший подход для достижения этого?

Я вижу, что ни один из конструкторов, сгенерированных Hibernate, не принимает идентификатор в качестве аргумента.Есть ли причина для этого?

Я мог бы создать собственный конструктор, который включает в себя идентификатор в качестве параметра, но я действительно не хочу менять сгенерированный POJO, так как очень вероятно, что моя база данных изменится, иЯ не хочу терять все свои закодированные вещи, если я автоматически регенерирую POJO.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

не будет намного лучше, если вы превратите свою сущность в DTO?если вы не хотите получать сопоставленный список от своего родителя.

что-то вроде этого

`

public class PeopleDTO {

 private Integer id;
 private String name;
 private String surname;
 private String phone;
 private String email;
 private String dui;
 private String address;
 private Boolean state;

 public PeopleDTO() {
 }


 public PeopleDTO(String name, String surname, String phone, String email, String dui, String address) {
    this.name = name;
    this.surname = surname;
    this.phone = phone;
    this.email = email;
    this.dui = dui;
    this.address = address;
 }

`

String queryString = "SELECT new PeopleDTO(p.name, p.surname, p.phone, p.email, p.dui, p.address) FROM People p";

0 голосов
/ 04 октября 2018

Очевидно, я сам придумал решение.

Испытывая разные подходы, большую часть времени я получал исключение LazyInitializationException .Я продолжал обвинять Hibernate в этой проблеме, так как думал, что она запускает исключения самостоятельно, сразу после выполнения запроса.Однако я не смог понять, что загрузка отношений была инициирована, когда Джерси попытался сериализовать сущности в JSON, и, следовательно, выбросил исключения из-за отложенных загрузок отношений.Так что проблема была в Джерси, а не в Hibernate.Забавная цепочка недоразумений из-за того, что я не привык к Hibernate.

Наконец, я выбрал «стандартную» форму поиска HQL, которая возвращает сущности со всемииз его полей (включая идентификаторы), затем обнуляя отношения каждой сущности в выбранном списке перед возвратом его в сервлет Джерси:

tra = ses.beginTransaction();
String queryString = "FROM People";
Query query = ses.createQuery(queryString, People.class);
List<People> people = query.list();

for (People p : people) {
    p.setUserses(null);
}

return people;

В результате я получаю список людей без их детейотношения.

Однако я не совсем уверен, является ли это наилучшим возможным подходом, поскольку, если я применю это для случая, когда мне нужно объединить различные объекты, я в конечном итоге получумножество вложенных foreachs для аннулирования нежелательных отношений каждой вовлеченной сущности.

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