powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate - взять значение "через голову" ManyToOne
15 сообщений из 15, страница 1 из 1
Hibernate - взять значение "через голову" ManyToOne
    #39337530
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть код, который при считывании данных автоматически не грузит удалённые.
Упрощённо так:
Код: 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
Hibernate - взять значение "через голову" ManyToOne
    #39337561
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию?
Насколько я знаю, язык HQL это позволяет.
Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."?
...
Рейтинг: 0 / 0
Hibernate - взять значение "через голову" ManyToOne
    #39337583
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию?
Насколько я знаю, язык HQL это позволяет.
Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."?

Да, именно что можно добавить (и добавил для теста), но выглядит это костыльно.
Класс, который добавляет условия, не знает про специальные случаи. Пришлось добавить мапу specialFilterOfDeletedMap и снаружи инициализировать её (тот, снаружи, знает при специфичные особенности сущностей). Т.е. совсем г@внокода нет, но всё одно, как-то не радует.
...
Рейтинг: 0 / 0
Hibernate - взять значение "через голову" ManyToOne
    #39337717
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hibernate - взять значение "через голову" ManyToOne
    #39338647
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hibernate - взять значение "через голову" ManyToOne
    #39338725
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hibernate - взять значение "через голову" ManyToOne
    #39338830
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulМожет у вас в Parent нет поля deleted? Или оно как-то по другому называется?

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

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

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

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

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

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

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

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

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

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

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

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


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