|
|
|
Вопрос по Hibernate mapping
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть три таблицы : Object, Person и PersonRole, а так же таблица связок Object2Person, которая содержит три поля ObjectID <pk,fk>,PersonID<pk,fk> и RoleID<pk,fk>. В таблице PersonRole ограниченное число записей. Как правильно замаппить такую конструкцию, чтобы делая запрос "from Object where nID=n" извлекался объект n, в котором бы уже находилась коллекция со связанными Person и PersonRole соответственно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 16:19 |
|
||
|
Вопрос по Hibernate mapping
|
|||
|---|---|---|---|
|
#18+
Опять не сочтите за оригинальность, но могу только посоветовать с точки зрения похожести систем Hibernate и OJB. Я давно пользуюсь OJB и там реализация обслуживания внешних ключей выполнена очень удобно. Ну, во-первых, как для одного ORM'а, так и для другого, существуют настроечные файлы (для OJB это repository_user.xml), где описывается структура базы. Например, таблица А (id, nameA) и таблица В (id, nameB, aID), где, как понятно, aID ссылается на ключевое поле id таблицы А. Настроечный файл будет выглядеть следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Как видно, наша структура "связывает" классы-бины, которые мы образовываем. Для таблицы А - класс ClassA: Код: plaintext 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. И для таблицы В класс ClassB: Код: plaintext 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. Теперь после выполнения определенных запросов Query мы можем манипулировать бинами. Например, если был запрос для бина В, то мы получаем переменную nameA типа ClassA, для которой доступны поля: getId() и getNameA(), а также (!) поле namesB типа Collection, для которого namesB.iterator().next() - это объект типа ClassB (бин В) - понятно, что в коллекции столько их, сколько в таблице В есть строк, в которых aID указывает на нужную нам строку в таблице А. По своему опыту убедился, что это очень удобно: элементарное обращение к полям бина, ссылки, изменение и т.д. Соответственно, если идут каскадные или перекрестные ссылки для большего количества таблиц, то все они работают точно так же, нюансов практически не существует. Также почти уверен, что подобная структура существует и в Hibernate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 23:15 |
|
||
|
Вопрос по Hibernate mapping
|
|||
|---|---|---|---|
|
#18+
IDVsbruck большое спасибо, но как замапить в hibernate две таблицы отношением many-to-many я знаю. Вопрос в том, как боротья, когда их три? Конечно синтаксис в OJB слегка не такой, но всё по аналогии :)) Неужели никто не сталкивался с такой ситуацией ? заранее спасибо за возможные способы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:09 |
|
||
|
Вопрос по Hibernate mapping
|
|||
|---|---|---|---|
|
#18+
Объясню в чём непонимание - если бы связывались две таблицы, например Object и Person, то была бы нужна таблица связок Object2Person, в которой соответственно было бы два поля - ObjectID <pk,fk> и PersonID <pk,fk>. В классе class Object добавили бы коллекцию, допустим Set: private Set LinkedPerson; и замаппили бы соответственно // маппинг для класса Object ...... ...... <set name="linkedPerson" table="Object2Person" inverse="true"> <key column="ObjectID" /> <many-to-many column="PersonID" class="Person" /> </set> в конечном итоге при запросе "from Object where nID=n" мы мы получили объект с коллекцией linkedPerson, где содержались бы все связанные с данным Object объекты Person. то, что было нужно. Вопрос - когда в таблице связок не два поля, а три (ObjectID <pk,fk>,PersonID<pk,fk> и RoleID<pk,fk>), то как это замаппить?? примерно как : <set name="linkedPerson_ROLE" table="Object2Person" inverse="true"> <key column="ObjectID" /> <many-to-many column= ??? <!-- что писать дальше ? --> </set> выручайте :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:35 |
|
||
|
Вопрос по Hibernate mapping
|
|||
|---|---|---|---|
|
#18+
IdoL_Здравствуйте! Есть три таблицы : Object, Person и PersonRole, а так же таблица связок Object2Person, которая содержит три поля ObjectID <pk,fk>,PersonID<pk,fk> и RoleID<pk,fk>. В таблице PersonRole ограниченное число записей. Как правильно замаппить такую конструкцию, чтобы делая запрос "from Object where nID=n" извлекался объект n, в котором бы уже находилась коллекция со связанными Person и PersonRole соответственно ? Похоже, ты и сам запутался, и других пытаешься запутать :). Как может быть таблица связок, в которой поля-связки - PrimaryKey??? Я так понимаю, что там могут быть записи типа: 1 1 1 (для 1-го объекта у 1-го чувака роль 1), 1 2 1 (для 1-го объекта у 2 чувака роль 1), 2 1 2 (для 2-го объекта у 1-го чувака роль 2), 2 2 1 (для 2-го объекта у 2-го чувака роль 1), так? И тебе надо получить при выполнении запроса "from Object where nID=n" объект Object, в котором была бы (были бы) коллекция, о которой ты сказал? Какая разница, сколько таблиц связываются? Создаешь бины четырех объектов: Object, Person, PersonRole, Object2Person, связываешь их посредством обычных связей "один-ко-многим" (для OJB я такую связку дал, а для Hibernate, похоже, ты используешь аналогичную). Соответственно, в первых трех будет по одному "многие-к-одному" (реализация в Java как Collection), а в четвертой - три "один-ко-многим" (реализация - соответствующие объекты-бины). Опять-таки, если аналогия нормально работает, то после запроса ты получаешь объект Object, у которого кроме полей, описывающих поля связанной с ним таблицы (через Hibernate), есть поле типа Collection, в котором хранятся (назовем так для простоты) объекты типа Object2Person (связь "один-ко-многим"). А у объекта Object2Person кроме трех основных типа Integer (точнее, четырех - если поле ObjectID у него все же не PrimaryKey, то добавляем ключевое поле ID, по которому будет производиться сортировка), есть еще 3 поля - классов Object, Person и PersonRole соответственно. Взяв, к примеру, 1-ый элемент коллекции и приведя его к классу Object2Person, получаем нужную тебе связку. Если это снова не оно, то я тебя просто не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 19:47 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=703&tid=2148339]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 361ms |

| 0 / 0 |
