|
|
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Добрый вечер, у меня в проекте используется хибернат. Все сущности наследуются от одной способом: InheritanceType.SINGLE_TABLE , но поля не в той же таблице, а в соответствующих которые подключаются с помощью @SecondaryTable @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "types", discriminatorType = DiscriminatorType.STRING) public abstract class ObjEntity …... @Entity @SecondaryTable(name="user" public class User .......ь сущность) соответственно если обратиться к этому полю в запросе или вынут @Column(table = "user") private String name; ….......................... так вот, у меня есть задачи в которых конкретный класс сразу неизвестен, и приходится писать общего предка ( ObjEntity ) соответственно если обратиться к этому полю в запросе или вынуть сущность у которой стоит такое поле атрибутом, то хибернат сделает запрос ко всем сущностям проекта расширяющихся от ObjEntity и та у которой id совпадет ту и вернет. Я слышал что есть какой-то способ решение этой проблемы но так его и не нашел. Может кто-то уже сталкивался с таким? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 00:40 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
при вставке, произошол какой-то глюк, приведу иерархию в пример еще раз: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "types", discriminatorType = DiscriminatorType.STRING) public abstract class ObjEntity { ................................ } @Entity @SecondaryTable(name="user" public class User extend ObjEntity { @Column(table = "user") private String name; .......................................... } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 01:13 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Или я не очень правильно понял твой вопрос, или ты несколько усложняешь себе жизнь, когда можно было бы сделать все несколько проще и переложить всю грязную и сложную работу на хибер. Предок и в то же время сущность, хранящая общие поля: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. наследники: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Если класс точно известен, то искать можно сразу в нужном наследнике, причем, при поиске в user можно использовать поле someField предка. Если нет, то можно искать в предке. И хотя вернет лист/объект типа ObjEntity, но typeof покажет реальный класс объекта - User или Visitor. О какой проблеме ты говоришь, не очень понимаю и представляю. Применил такую структуру для регистрационных таблиц (базовая, фейсбук, твиттер, гугл и т.д.) и в зависимости от задачи выбираю или из нужного наследника, или из предка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 01:26 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
P.S. Не видел твою поправку, писал ответ. У меня почти то же самое, но проблемы не вижу и не понимаю ее смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 01:29 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, попробуй обратиться вот так: session.get(ObjEntity.class, 1) в этом случаи хибернта сделает джоин 3х таблиц: ObjEntity, User, Visitor и вернет ту где ид = 1. Задача сделать так чтоб он не делал этого джойна, а сразу обратился к нужной таблице. Пояснение к задаче, есть у меня в проекте такие моменты, где надо указывать родительский класс, а не конкретный, к примеру есть таблица связи в которой можно логически связать 2 любых объекта, будь-то пользователь и документ или документ и карта и т.д. вот в таких местах и приходится писать общего предка ObjEntity Я использую тип наследования: иерархия класса в 1 таблице, но разношу поля по до подключенным, на внешний вид похоже на InheritanceType.JOINED, но есть НО, у меня есть дискриминатор в котором указана имя сущности-таблицы с доп полями. То есть ObjEntity кроме ид у меня хранится и имя сущности соответствующей этому ид, к приvеру: 1 User 2 Visitor Это стандартный механизм в хибернате. Так вот я слышал, что можно каким то способом, когда используется такой вид наследования сделать так, что при обращении session.get(ObjEntity.class, 1) будет делать конкретное обращение к конкретной таблицы, а не поиск по всем где ид совпадет. Надеюсь понятно расписал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 02:06 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Совершенно непонятно. Стало еще запутанней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 13:10 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Может отложить в сторону Hibernate и просто подумать а как именно вы хотели бы видеть поиск по колонке, когда не известно имя таблицы? Может какую-нибудь view тогда сделать с union по всем наследникам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 13:16 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Давайте на коде покажу что хочется добиться и тогда будет ясно) Код: 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. 34. 35. 36. 37. и тут хибернат сделает селект по objEntity и приджойнит и user и visitor и вернет ту у которой совпадет ид. Это дефолтовая логика. Но я слышал, что есть решения, как сделать в хибернате так, чтоб при запросе session. get(ObjEntity, 1)(при запросе к родительской сущности) , он посмотрел на дискриминатор "type" и прийджойнил только конкретную таблицу. Вот вопрос в этом, как в хибернате такое сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 13:37 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Так понятнее дискриминатор я сразу и не приметил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:24 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
А давайте вы теперь определитесь с маппингом. Вам JOINED ведь нужен. Почему везде SINGLE_TABLE написано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:27 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, нет мне JOINED не нужен, я и не его писал сразу в первом посте, у меня в проекте(еще до меня) все сущности от InheritanceType.SINGLE_TABLE. а мне теперь на уже существующей структуре из больше чем 200 сущностей нужно сделать чтоб при запросе к родителю, такого громадного джойна не было. Задача у меня такая) Да, в уточнение при InheritanceType.SINGLE_TABLE прошу прощения из примера в этом же топике копировал код и упустил момент, в потомках надо вместо @Table, @SecondaryTable использовать, или работать не будет. то есть: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Вот теперь точный пример, еще раз очень извиняюсь. Жду помощи) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:31 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Может, что-то и есть, но так ли оно нужно? В твоем приведенном случае какой тип будет иметь переменная, которая получает session. get(ObjEntity, 1)? (понятно, мы ее определили как ObjEntity) Но вот после переопределения она уже будет User. Поэтому банально, зная, что ты хочешь пройтись по таблице user, проверяешь: Код: java 1. 2. Второй вариант. Я его сначала не использовал, так как он избыточен, но для использовании в представлении оказался удобнее - у предка сразу указывать тип записи (похоже, ручная реализация искомого тобой дискриминатора): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Тогда Код: java 1. 2. или Код: java 1. Хотя, возможно, ты и прав - если есть механизм, автоматически реализующий задуманное, то наверняка он лучший. Правда, он автоматически становится ненужным, если сработает такое (не проверял, но почему-то уверен, что работает): Код: java 1. 2. 3. И этот дескриптор оказывается ненужным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:33 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
А можно теперь запрос посмотреть, которых хибер генерит? Он все-все таблицы джоинит? А это действительно сказывается на производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:37 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, проблема в том, что при запросе ObjEntity obj = session. get(ObjEntity.class, 1); хибер делает джоин всех сущностей наследуемых от ObjEntity, в моем случаи это больше чем 200 джойнов))) как это победить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:37 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, да все таблицы джоинит, сказывается на производительности, при бизнес логике у меня в методе бывает, 7-8 таких запросов, смотрится страшно и тормозит, я не замерял по цифрам. получил здание избавится от таких запросов не переписывая бизнес-логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:39 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Вот оно, кажется: https://hibernate.onjira.com/browse/ANN-103 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:40 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Да, может, и не такие страшные эти затраты - столько джойнов делать. Кстати, действительно, какие запросы генерит хибер в двух случаях: 1. session.get(ObjEntity.class, 1) 2. session.get(User.class, 1) при стратегии наследования JOINED? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:41 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, что-то я не совсем понял, как у @SecondaryTable указать fetch="select" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:55 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
slipperyчто-то я не совсем понял, как у @SecondaryTable указать fetch="select" Какие ж все ленивые. Там тикет залинкован. В нем написано. http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/Table.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:58 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
как я понял нельзя такое сделать.....хотя у меня в проекте хибернат 4.1 уже новее чем 3.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 14:58 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
slippery, я просто javax подключал таблицы, не увидел ,сейчас проверю, отпишусь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 15:01 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ОГРОМНОЕ СПАСИБО! Работает!!!)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 15:34 |
|
||
|
Hibernate, наследование
|
|||
|---|---|---|---|
|
#18+
интересно, это нормально спрашивать на собес-и у джуниора о наследовании в хибернейт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2014, 09:21 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37809841&tid=2126264]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
396ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 724ms |

| 0 / 0 |
