Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate / 22 сообщений из 22, страница 1 из 1
29.05.2019, 15:46
    #39819897
domestos123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate
Привет, возникла небольшая проблема с 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
29.05.2019, 16:07
    #39819916
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate
авторМетод, который в качестве аргумента принимает класс объекта и возвращает все записи, которые связаны с полученным классом.
В чём ошибка-то?
...
Рейтинг: 0 / 0
29.05.2019, 16:10
    #39819925
domestos123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate
Garrick,

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

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

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

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

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

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

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


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




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




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

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




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


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

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

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

оксес - не субд.
а кто говорил про акс?
...
Рейтинг: 0 / 0
03.06.2019, 01:42
    #39821437
domestos123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate
Я нашел решение проблемы. Тема закрыта!
...
Рейтинг: 0 / 0
16.06.2019, 18:04
    #39826977
sysout_dd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate
Продублирую вопрос еще и здесь, чтобы новую тему не заводить:
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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