Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate - взять значение "через голову" ManyToOne / 15 сообщений из 15, страница 1 из 1
31.10.2016, 09:25
    #39337530
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Добрый день!

Есть код, который при считывании данных автоматически не грузит удалённые.
Упрощённо так:
Код: java
1.
2.
3.
4.
         
        for (String name : sessionFactory.getClassMetadata(entityClass))
            if ("isDeleted".equals(name))
                queryString += " where isDeleted = false";



И есть сущность (Child), у которой нет своего признака "удалён", а есть parent у которого isDeleted.
Хочется, чтобы фильтрация добавилась автоматом.

Идея такая- я как-то добавляю в поля класса Child нечто, что не требует поля в БД (долго добавлять), но при этом в classMetadata оно как-то попадёт.
Так, естественно не работает:
Код: java
1.
2.
3.
4.
5.
    @ManyToOne
    private Parent parent;

    @Column(name = "parent.deleted")
    private boolean isDeleted;



В общем-то можно сделать и подругому, но хочется (ради красоты и простоты изменения):
- не менять структуру БД
- не вводить никаких "если это класс Child то добавим-ка фильтр..."

--
Алексей.
...
Рейтинг: 0 / 0
31.10.2016, 09:54
    #39337561
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию?
Насколько я знаю, язык HQL это позволяет.
Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."?
...
Рейтинг: 0 / 0
31.10.2016, 10:07
    #39337583
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
SQL2008Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию?
Насколько я знаю, язык HQL это позволяет.
Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."?

Да, именно что можно добавить (и добавил для теста), но выглядит это костыльно.
Класс, который добавляет условия, не знает про специальные случаи. Пришлось добавить мапу specialFilterOfDeletedMap и снаружи инициализировать её (тот, снаружи, знает при специфичные особенности сущностей). Т.е. совсем г@внокода нет, но всё одно, как-то не радует.
...
Рейтинг: 0 / 0
31.10.2016, 11:43
    #39337717
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey TominДа, именно что можно добавить (и добавил для теста), но выглядит это костыльно.
Класс, который добавляет условия, не знает про специальные случаи. Пришлось добавить мапу specialFilterOfDeletedMap и снаружи инициализировать её (тот, снаружи, знает при специфичные особенности сущностей). Т.е. совсем г@внокода нет, но всё одно, как-то не радует.


Можно. Только не ч/з @Column.

1)
Код: java
1.
2.
@ManyToOne(fetch=fetch = FetchType.EAGER)
private Parent parent;



2)
Код: java
1.
2.
3.
4.
@Transient
public boolean isDeleted() {
   return parent.getIsDeleted();
}



Где-то так :-)
...
Рейтинг: 0 / 0
01.11.2016, 11:38
    #39338647
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
mad_nazgul1)
Код: java
1.
2.
@ManyToOne(fetch=fetch = FetchType.EAGER)
private Parent parent;




2)
Код: java
1.
2.
3.
4.
@Transient
public boolean isDeleted() {
   return parent.getIsDeleted();
}


Где-то так :-)

Не выходит...

1. metadata.getPropertyNames() не содержит isDeleted или deleted
2. при попытке добавить where isDeleted = false (или deleted) - ошибка
"com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'deleted' in 'where clause'"
...
Рейтинг: 0 / 0
01.11.2016, 12:25
    #39338725
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey TominНе выходит...

1. metadata.getPropertyNames() не содержит isDeleted или deleted
2. при попытке добавить where isDeleted = false (или deleted) - ошибка
"com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'deleted' in 'where clause'"

Попробуйте включить отображение какие запросы генерит Hibernate.
По идее должно работать, т.к.

1) EAGER - задает, чтобы при загрузки сущности сразу грузился объект Parent
2) Аннотация @Transient говорит, что бы EntityManager не воспринимал поле как колонку таблицы.

Может у вас в Parent нет поля deleted? Или оно как-то по другому называется?
...
Рейтинг: 0 / 0
01.11.2016, 13:35
    #39338830
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
mad_nazgulМожет у вас в Parent нет поля deleted? Или оно как-то по другому называется?

Есть.
Добавленное несколько криво "where parent.deleted = false" работает, а правильно "where deleted = false" - нет.
А вообще я не понимаю, как может попасть @Transient поле может попасть в парсер HQL
...
Рейтинг: 0 / 0
01.11.2016, 14:16
    #39338909
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey Tominmad_nazgulМожет у вас в Parent нет поля deleted? Или оно как-то по другому называется?

Есть.
Добавленное несколько криво "where parent.deleted = false" работает, а правильно "where deleted = false" - нет.
А вообще я не понимаю, как может попасть @Transient поле может попасть в парсер HQL

Согласен что-то странное.

parent.getIsDeleted() - оно вообще должно отрабатывать после запроса.
...
Рейтинг: 0 / 0
01.11.2016, 15:28
    #39339037
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
А не могут быть такие странности из-за области видимости свойств и методов объектов - public, private?
Например, в с++ это вполне возможно.
...
Рейтинг: 0 / 0
01.11.2016, 16:45
    #39339138
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
mad_nazgulСогласен что-то странное.

parent.getIsDeleted() - оно вообще должно отрабатывать после запроса.

Именно что. А мне надо до запроса.
При этом надо как-то объяснить hibernate, что надо так вот извернутся.
...
Рейтинг: 0 / 0
02.11.2016, 06:48
    #39339517
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey Tominmad_nazgulСогласен что-то странное.

parent.getIsDeleted() - оно вообще должно отрабатывать после запроса.

Именно что. А мне надо до запроса.
При этом надо как-то объяснить hibernate, что надо так вот извернутся.

Э-э-э чта?!
Hibernate все таки детерминированный фреймворк, а не квантовый. :-)
Как можно узнать, состояние поля, до обращения к БД?!

Если бы Hibernate был бы квантовым движком, то используя состояние запутанности м/у таблицей и сущностью, то как так вы говорите можно было сделать.

А так, пока никак. :-)
...
Рейтинг: 0 / 0
02.11.2016, 09:08
    #39339567
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Эта постановка не из за того, что некоторые любят вместо удаления сущности ставить галку в бд 'как бы удалён'?
...
Рейтинг: 0 / 0
02.11.2016, 11:09
    #39339674
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Alexey TominИменно что. А мне надо до запроса.
При этом надо как-то объяснить hibernate, что надо так вот извернутся.
Самое простое - Создайте в базе вьюху и берите не удаленные (в т.ч. по дереву) записи из нее.
Посложнее - тоже самое провернуть с query в Hibernate. (можно, например, join использовать)
...
Рейтинг: 0 / 0
02.11.2016, 11:12
    #39339679
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
Petro123Эта постановка не из за того, что некоторые любят вместо удаления сущности ставить галку в бд 'как бы удалён'?
Так бывает полезно. И удален - это только частный случай.

В любом случае если тебе нужны только дети Ивана Ивановича Петрова, выкачивать из базы все 7 миллиардов населения Земли, чтоб потом установить кто из них кому родитель не лучшая идея.
...
Рейтинг: 0 / 0
02.11.2016, 11:25
    #39339702
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate - взять значение "через голову" ManyToOne
OFF
Сергей АрсеньевТак бывает полезно. И удален - это только частный случай.
Бывает конечно).
Приходилось везде по разному решать. Когда копия строки с псевдо ID, когда в архив, когда в другую базу OLAP\LTP и т.д. и т.п.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate - взять значение "через голову" ManyToOne / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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