Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate exception: не удаётся вернуть запрос из джойнов. / 25 сообщений из 27, страница 1 из 2
11.12.2018, 18:09
    #39746230
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Короче я стараюсь сделать запрос к двум сущностям с помощью джойнов, но при этом вернуть коллекцию сущностей определённого типа.

Вот ссылка на проект, а если ещё точнее на классы: здесь . Там описаны сущности для Author и Book как вы видите. В тестовом методе я пишу примерно вот такой код, в котором я пишу запрос, каким я должен вывести всех авторов, которые есть в списке авторов authors и написал книгу с определённым id:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Test
public void testRemoveAuthorsFromBookRecord(){
       
       /*em - entityManager и он объявлен. authors тоже.
        * rBook - сущность нужной книги, из которой я беру id
        * authors - просто набор объектов авторов типа Set, 
        * которые могут и не соответствовать ни одному из 
        * авторов, которые соответствуют записям о каких-либо книгах*/

       final String hql = "SELECT a FROM Author as a "+
                           "INNER JOIN a.books as b " +
                           "WHERE b.id = :book_id AND a IN ( :authors )";
        final Session session = em.unwrap(Session.class);
        Assert.assertNotNull(session);
        final Query query = session.createQuery(hql, Author.class)
              .setParameter("book_id", rBook.get().getId())
              .setParameterList("authors", authors);

        final List<Author> result = query.getResultList();

        /*** дальше идёт код чтения и вывод всех элементов на экран ***/

}



но такой код у меня почему-то падает в этом месте:

code linefinal List<Author> result = query.getResultList();

текст ошибки:

Код: plaintext
1.
java.lang.IllegalStateException: org.hibernate.TransientObjectException: 
object references an unsaved transient instance - save the transient instance before flushing: org.spring.learning.core.ioc.chapter1.Author

Я примерно знаю, что ошибка означает, что мой запрос возвращает сущности разных типов, а не одного уникального типа , а именно Author. Это если в общих чертах, но я не знаю, как исправить. Гугл не помог. В статьях, что он мне выдал советовали добавить в поле books сущности Authors кроме маппинга ещё свойство
Код: plaintext
cascase = CascadeType.ALL
и/или использовать ResultTransformer, но у меня не получилось ничего. Может быть вы знаете как сделать. Скажите как быть ???
...
Рейтинг: 0 / 0
11.12.2018, 18:36
    #39746241
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrive,
Нарисуй схему классов.
Старайся использовать left join
...
Рейтинг: 0 / 0
11.12.2018, 19:14
    #39746246
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Petro123DrillDrive,
Нарисуй схему классов.
Старайся использовать left join
...
Рейтинг: 0 / 0
11.12.2018, 19:24
    #39746248
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrive,
С inner я поторопился. Пусть будет.
Второе условие в where не лишнее?
...
Рейтинг: 0 / 0
11.12.2018, 19:28
    #39746251
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Petro123Второе условие в where не лишнее?

нет. Нужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).
...
Рейтинг: 0 / 0
11.12.2018, 19:44
    #39746254
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrivePetro123Второе условие в where не лишнее?

нет. Нужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).а ты попробуй.
Если искать по айди, то все другие условия уже не важны.
...
Рейтинг: 0 / 0
11.12.2018, 20:11
    #39746260
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDriveНужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).а по-русски?

Petro123Если искать по айди, то все другие условия уже не важны.+1
...
Рейтинг: 0 / 0
11.12.2018, 22:29
    #39746303
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
вадяDrillDriveНужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).
а по-русски?

Нужно найти авторов, которые написали конкретную книгу( книгу, которую я определяю по id уже в другом запросе) и они есть среди списка авторов( IN clause).

простите, что не сразу написал правильно, просто сообщения форум не можем переправлять, если оно уже отправлено.

Petro123а ты попробуй.
Если искать по айди, то все другие условия уже не важны.


Я так сделал. У меня сработало. Спасибо. Правда, если я убрал это второе условия у WHERE, все равно нужно сделать ещё проверку, что найденные авторы книги есть среди тех, что находятся внутри коллекции. Неужели мне придётся писать для этого третий запрос ???
...
Рейтинг: 0 / 0
11.12.2018, 22:32
    #39746307
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDriveЯ так сделал. У меня сработало. Спасибо. Правда, если я убрал это второе условия у WHERE, все равно нужно сделать ещё проверку, что найденные авторы книги есть среди тех, что находятся внутри коллекции. Неужели мне придётся писать для этого третий запрос ???

Просто у меня общее задание такое: написать метод, который удаляет набор авторов из определённой книги.
...
Рейтинг: 0 / 0
12.12.2018, 06:55
    #39746394
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?
...
Рейтинг: 0 / 0
12.12.2018, 07:24
    #39746405
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDriveНужно найти авторов, которые написали конкретную книгу( книгу, которую я определяю по id уже в другом запросе) и они есть среди списка авторов( IN clause).
Если маппинг правильный то это:
Код: java
1.
2.
Книга кн = getКнига(id)
АвторыКниги список = кн.Авторы.


Проверяй.
...
Рейтинг: 0 / 0
12.12.2018, 14:20
    #39746677
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDriveЯ примерно знаю, что ошибка означает, что мой запрос возвращает сущности разных типов, а не одного уникального типа
По ходу не знаешь.

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

То есть ты суёшь на вход список авторов, которых хибер вот так интерпретирует. Не знаю, откуда авторы, тебе там виднее, но копать надо в эту сторону.
...
Рейтинг: 0 / 0
12.12.2018, 20:17
    #39746939
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
вадяDrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?

Я под этим подразумеваю коллекцию типа List<Author>. Её я и передаю в :authors

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//книга, из которой берём id и заполняем авторами 

Book b = new Book("Война и мир");
        b.setPrice(new BigDecimal(78.67));
        b.getAuthors().add( new Author("Лев","Толстой"));

final List<Author>authors = book.
                getAuthors().
                stream().
                collect(Collectors.toList());

authors.add(new Author("Иван", "Мясников"));
...
Рейтинг: 0 / 0
12.12.2018, 21:20
    #39746955
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrive,
Я не врубаюсь зачем тебе вторые авторы).
...
Рейтинг: 0 / 0
13.12.2018, 13:27
    #39747339
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDriveвадяDrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?

Я под этим подразумеваю коллекцию типа List<Author>. Её я и передаю в :authors

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//книга, из которой берём id и заполняем авторами 

Book b = new Book("Война и мир");
        b.setPrice(new BigDecimal(78.67));
        b.getAuthors().add( new Author("Лев","Толстой"));

final List<Author>authors = book.
                getAuthors().
                stream().
                collect(Collectors.toList());

authors.add(new Author("Иван", "Мясников"));



У тебя есть БД, с книгами и авторами.
Судя по всему из этого когда ты хочешь найти книги по авторам, которые в БД даже не сохранены.
Каким образом hibernate должен решить, по каким полям искать совпадение?
...
Рейтинг: 0 / 0
13.12.2018, 13:45
    #39747363
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
pavel_nv,
Твоя догадка неверна. Не получится искать в короткой веб транзакции таких авторов..
...
Рейтинг: 0 / 0
13.12.2018, 13:56
    #39747372
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Petro123,

С чего это?
Допустим автор может написать за свою жизнь книг 100.
Т.е. найти 100 строк по индексу в современной БД за 30-100 мс не реально?


Посмотрел повнимательнее запрос:
Код: java
1.
2.
3.
final String hql = "SELECT a FROM Author as a "+
                           "INNER JOIN a.books as b " +
                           "WHERE b.id = :book_id AND a IN ( :authors )";


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

Если посмотреть внимательнее на ошибку
Код: java
1.
2.
java.lang.IllegalStateException: org.hibernate.TransientObjectException: 
object references an unsaved transient instance - save the transient instance before flushing: org.spring.learning.core.ioc.chapter1.Author


Так вообще ошибка в том, что либо сохраняют (передают в параметры) Book с несохраненными Author в коллекции, либо в параметр ":authors" передают несохраненных Author
...
Рейтинг: 0 / 0
13.12.2018, 13:58
    #39747376
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
PS с Hibernate не работал, знаком только на уровне пролистывания доки
...
Рейтинг: 0 / 0
13.12.2018, 14:19
    #39747393
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
pavel_nvPS с Hibernate не работал, знаком только на уровне пролистывания докикороткие в веб, это начало на post и коммит на выход. Это 0,01сек.
Так?
Кого там искать за это время без базы?
...
Рейтинг: 0 / 0
13.12.2018, 14:31
    #39747410
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Petro123pavel_nvPS с Hibernate не работал, знаком только на уровне пролистывания докикороткие в веб, это начало на post и коммит на выход. Это 0,01сек.
Так?
Кого там искать за это время без базы?

Что то я не понимаю Тебя...

Был изначально вопрос про хибернейт.
Логично, если передавать объект в качестве параметра, то искать он будет по полю ключа (@Id)
Если объект параметра не сохранен - то получаем ошибку.
Никаких требований про 10мс не было.

Зачем притягивать "поиск без базы за 0,01сек" к теме про Hibernate?
...
Рейтинг: 0 / 0
13.12.2018, 14:43
    #39747418
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
pavel_nv,
Ты не знаешь хибер и подумал что запрос не к базе.
Так?
Я сказал что запрос именно к базе. Иначе нельзя.
Все.
...
Рейтинг: 0 / 0
13.12.2018, 14:47
    #39747424
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
DrillDrive,
Код: sql
1.
SELECT a FROM Author


что такое а
...
Рейтинг: 0 / 0
13.12.2018, 14:50
    #39747429
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
Petro123pavel_nv,
Ты не знаешь хибер и подумал что запрос не к базе.
Так?

Я сказал
pavel_nvСудя по всему из этого когда ты хочешь найти книги по авторам, которые в БД даже не сохранены.

Другими словами: найти по параметрам (объекты класса Author), которые в БД не сохранены (не имеют ID).

С базами я знаком)
...
Рейтинг: 0 / 0
13.12.2018, 15:05
    #39747449
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
pavel_nv,
Нельзя в одном where обращаться и к сохраненным и к нет.
...
Рейтинг: 0 / 0
13.12.2018, 15:10
    #39747451
DrillDrive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate exception: не удаётся вернуть запрос из джойнов.
вадяDrillDrive,
Код: sql
1.
SELECT a FROM Author


что такое а

a - это объект-сущность Author со всеми полями. Т.е. я прошу select запрос вернуть значения всех колонок таблицы, относящиеся к полям объекта Authors.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate exception: не удаётся вернуть запрос из джойнов. / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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