powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate
22 сообщений из 22, страница 1 из 1
Java Hibernate
    #39819897
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, возникла небольшая проблема с Hibernate. Недавно начал изучение и не получается решить одну проблему.
У меня существует 3 сущности: Автор, Произведения автора. Связь между сущностями много-ко-многим.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@Entity(name = "Author")
@Table(name = "authors")
@AttributeOverride(name = "id", column = @Column(name = "AuthorID"))
public class Author extends Person{
    
    @Column(name = "Years_of_life")
    private String yearsOfLife;
    @Column(name = "MiddleName")
    private String middleName;
    
    
    public Author(String firstName, String lastName, String middleName, String yearOfLife) throws StringException
    {
        super(firstName, lastName);
        this.setMiddleName(middleName);
        this.setYearsOfLife(yearOfLife);
    }

//getters and setters
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
@Entity(name = "Product")
@Table(name = "product")
public class Product {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ProductID")
    private int id;
    @Column(name = "Title")
    private String title;
    @Column(name = "Description")
    private String description;
    @Column(name = "Keywords")
    private String keywords;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "authors_and_products",
            joinColumns = @JoinColumn(name = "ProductID"),
            inverseJoinColumns = @JoinColumn(name = "AuthorID"))
    private List<Author> authors;
    
    public Product()
    {
        
    }
    
    public Product(String title, String description, List<String> keywords, List<Author> authors, List<Genre> genres) 
            throws StringException, ListException
    {
        this.setTitle(title);
        this.setDescription(description);
        this.setAuthors(authors);
    }
//getters and setters



Метод, который в качестве аргумента принимает класс объекта и возвращает все записи, которые связаны с полученным классом.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 @Override
    public List<Object> getAll(Class<?> clazz) {
        session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
        Criteria criteria;
        session.getTransaction().begin();
        criteria = session.createCriteria(clazz);
        List<Object> list = criteria.list();
        session.getTransaction().commit();
        session.close();
        return list;
    }



В результате я в ответе получаю JSON в котором находится столько экземпляров одной единственной книги, скольким авторам она принадлежит: если с книгой связано 3 автора, я получаю 3 экземпляра, если 4 - 4 экземпляра и т.д. Не могу отловить ошибку:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
[{
"id":1,
"title":"books_title",
"description":"books_description",
"keywords":"books_keywords",
"authors":
    [{
      "yearsOfLife":"1",
      "middleName":"Sergeevich",
      "id":6,"firstName":"Alexander",
      "lastName":"Pushkin"
      },
      {
      "yearsOfLife":"2",
      "middleName":"SomaMiddleName",
      "id":7,"firstName":"SomeName",
      "lastName":"SomaLastName"
      },
      {
      "yearsOfLife":"3",
      "middleName":"AnotherMiddleName",
      "id":16,"firstName":"AnotherName",
      "lastName":"AnotherLastName"
    }]},
{


"id":1,
"title":"books_title",
"description":"books_description",
"keywords":"books_keywords",
"authors":
    [{
      "yearsOfLife":"1",
      "middleName":"Sergeevich",
      "id":6,
      "firstName":"Alexander",
      "lastName":"Pushkin"},
      {
      "yearsOfLife":"2",
      "middleName":"SomaMiddleName",
      "id":7,
      "firstName":"SomeName",
      "lastName":"SomaLastName"
      },
      {
      "yearsOfLife":"3",
      "middleName":"AnotherMiddleName",
      "id":16,
      "firstName":"AnotherName",
      "lastName":"AnotherLastName"
    }]},
{


"id":1,
"title":"books_title",
"description":"books_description",
"keywords":"books_keywords",
"authors":
    [{
      "yearsOfLife":"1",
      "middleName":"Sergeevich",
      "id":6,
      "firstName":"Alexander",
      "lastName":"Pushkin"
      },
      {
      "yearsOfLife":"2",
      "middleName":"SomaMiddleName",
      "id":7,
      "firstName":"SomeName",
      "lastName":"SomaLastName"
      },
      {
      "yearsOfLife":"3",
      "middleName":"AnotherMiddleName",
      "id":16,
      "firstName":"AnotherName",
      "lastName":"AnotherLastName"
    }]
}]
...
Рейтинг: 0 / 0
Java Hibernate
    #39819916
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМетод, который в качестве аргумента принимает класс объекта и возвращает все записи, которые связаны с полученным классом.
В чём ошибка-то?
...
Рейтинг: 0 / 0
Java Hibernate
    #39819925
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garrick,

Как задумывается: Мне возвращается один экземпляр книги, в котором если поле Authors, где находится 3 автора, как это и сделано в отдельно взятом экземпляре. Но мне из БД возвращается 3 одинаковых экземпляра, а нужен только один. Может что-то не так с Criteria? возможно, я неверно его использую или есть какие-нибудь альтернативы?
...
Рейтинг: 0 / 0
Java Hibernate
    #39819929
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
domestos123Garrick,

Как задумывается: Мне возвращается один экземпляр книги, в котором если поле Authors, где находится 3 автора, как это и сделано в отдельно взятом экземпляре. Но мне из БД возвращается 3 одинаковых экземпляра, а нужен только один. Может что-то не так с Criteria? возможно, я неверно его использую или есть какие-нибудь альтернативы?

есть поле Authors*
...
Рейтинг: 0 / 0
Java Hibernate
    #39819985
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domestos123, а отношение точно многие ко многим в этом случае?
...
Рейтинг: 0 / 0
Java Hibernate
    #39820013
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

да. У каждого автора может быть несколько книг, но и у книги может быть несколько авторов. Разве нет?
...
Рейтинг: 0 / 0
Java Hibernate
    #39820042
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domestos123,
Коллекция неверна? Тогда нафига тут json?
...
Рейтинг: 0 / 0
Java Hibernate
    #39820072
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

JSON я передаю клиентской стороне
...
Рейтинг: 0 / 0
Java Hibernate
    #39820084
WebPrj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
domestos123,
Вам модно попробовать не по классу искать, а у класса взять id книги и достать книгу из базы.
В книге полем будет список авторов.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820240
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WebPrj,

Хорошо, попробую сегодня вечером так. О результатах сообщу)
...
Рейтинг: 0 / 0
Java Hibernate
    #39820563
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domestos123,

если я всё правильно понял, то на SQL это выглядело бы так:
Код: plsql
1.
select * from product where productid in (select productid from relations where authorid = ?)


попробуйте session.createSQLQuery()
...
Рейтинг: 0 / 0
Java Hibernate
    #39820814
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrickесли я всё правильно понял, то на SQL это выглядело бы так:
Код: plsql
1.
select * from product where productid in (select productid from relations where authorid = ?)




in длительная операция, в данном примере её лучше заменить обычным join
да и * лучше не использовать, заменить на явное перечисление полей
...
Рейтинг: 0 / 0
Java Hibernate
    #39820831
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяGarrickесли я всё правильно понял, то на SQL это выглядело бы так:
Код: plsql
1.
select * from product where productid in (select productid from relations where authorid = ?)




in длительная операция, в данном примере её лучше заменить обычным join
да и * лучше не использовать, заменить на явное перечисление полей
Это недоказуемо на уровне Hibernate. Надо смотреть как ведёт себя конкретная DBMS и какой генерит план
и как быстро его исполняет.

При выборе как написать SQL-query, я-бы придерживался некого общего видения простоты и понятности
внутри dev-team. Если все участники code-review поняли что это и довольны - то можно оставить запрос
вот в таком виде.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820850
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяGarrickесли я всё правильно понял, то на SQL это выглядело бы так:
Код: plsql
1.
select * from product where productid in (select productid from relations where authorid = ?)




in длительная операция, в данном примере её лучше заменить обычным join
да и * лучше не использовать, заменить на явное перечисление полей

Тоже считаю что нужно использовать join. Он не будет тогда все записи выбирать, а потом обрезать ненужные.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820854
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяGarrickесли я всё правильно понял, то на SQL это выглядело бы так:
Код: plsql
1.
select * from product where productid in (select productid from relations where authorid = ?)




in длительная операция, в данном примере её лучше заменить обычным join


м....ну конечно же как обычно - нет. Как и сказал товарищ выше - надо смотреть план. К примеру, для постгрескуль in=inner join.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820856
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериннадо смотреть планэто всегда полезно
Озвериндля постгрескуль in=inner join.распространять один вариант на все , как бы ни есть хорошо.
некоторые субд, к примеру, запрос в in выполняли многократно....
...
Рейтинг: 0 / 0
Java Hibernate
    #39820868
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяОзвериннадо смотреть планэто всегда полезно
Озвериндля постгрескуль in=inner join.распространять один вариант на все , как бы ни есть хорошо.
некоторые субд, к примеру, запрос в in выполняли многократно....

оксес - не субд.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820873
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяОзвериннадо смотреть планэто всегда полезно
Озвериндля постгрескуль in=inner join.распространять один вариант на все , как бы ни есть хорошо.
некоторые субд, к примеру, запрос в in выполняли многократно....

так это ты предложил один вариант.
...
Рейтинг: 0 / 0
Java Hibernate
    #39820878
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
У него в классе есть поле list где список сущностей по связи. Не понял зачем тут sql.
...
Рейтинг: 0 / 0
Java Hibernate
    #39821047
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинвадяпропущено...
это всегда полезно
пропущено...
распространять один вариант на все , как бы ни есть хорошо.
некоторые субд, к примеру, запрос в in выполняли многократно....

оксес - не субд.
а кто говорил про акс?
...
Рейтинг: 0 / 0
Java Hibernate
    #39821437
domestos123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашел решение проблемы. Тема закрыта!
...
Рейтинг: 0 / 0
Java Hibernate
    #39826977
sysout_dd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продублирую вопрос еще и здесь, чтобы новую тему не заводить:
Java Hibernate JPA RedHat EX297
Коллеги, кто-нибудь сдавал сабж?
https://www.redhat.com/en/services/training/ex297-retired-red-hat-certified-specialist-in-persistence-exam

Из прочтения статьи не сложилось понимания, как это происходит фактически в российских реалиях. Существуют тест-центры (по аналогии с Pearson Vue для Oracle-овских экзаменов) или же сдается он-лайн как сертификация Spring?

Заранее благодарю прошедших за отзывы.

https://www.sql.ru/forum/1313744/java-hibernate-jpa-redhat-ex297?hl=
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]