powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по Hibernate mapping
6 сообщений из 6, страница 1 из 1
Вопрос по Hibernate mapping
    #33935342
IdoL_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть три таблицы : Object, Person и PersonRole, а так же таблица связок Object2Person, которая содержит три поля ObjectID <pk,fk>,PersonID<pk,fk> и RoleID<pk,fk>.
В таблице PersonRole ограниченное число записей.
Как правильно замаппить такую конструкцию, чтобы делая запрос
"from Object where nID=n" извлекался объект n, в котором бы уже находилась коллекция со связанными Person и PersonRole соответственно ?
...
Рейтинг: 0 / 0
Вопрос по Hibernate mapping
    #33936080
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять не сочтите за оригинальность, но могу только посоветовать с точки зрения похожести систем 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.
< class -descriptor  class ="com.test.dbmodel.ClassA" table="TableA">
	<field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true"></field-descriptor>
	<field-descriptor name="nameA" column="nameA" jdbc-type="VARCHAR" length="16"></field-descriptor>

	<collection-descriptor name="namesA" element- class -ref="com.test.dbmodel.ClassB"
		auto-retrieve="false" auto-update="link" auto-delete="object">
		<orderby name="id" sort="ASC"/>
		<inverse-foreignkey field-ref="aid"/>
	</collection-descriptor>
</ class -descriptor>

< class -descriptor  class ="com.test.dbmodel.ClassB" table="TableB">
	<field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true"></field-descriptor>
	<field-descriptor name="nameB" column="nameB" jdbc-type="VARCHAR" length="16"></field-descriptor>
	<field-descriptor name="aid" column="aID" jdbc-type="INTEGER"></field-descriptor>

	<reference-descriptor name="namesA"  class -ref="com.test.dbmodel.ClassA" auto-retrieve="false">
		<foreignkey field-ref="aID"/>
	</reference-descriptor>
</ class -descriptor>

Как видно, наша структура "связывает" классы-бины, которые мы образовываем. Для таблицы А - класс 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.
 package  com.test.dbmodel;

/**
 * @ojb.class table="TableA"
 */
 public   class  ClassA
{
	/**
	* @ojb.field primarykey="true" autoincrement="ojb"
	*/
	 private   int  id;
	/**
	 * @ojb.field length="16"
	 */
	 private  String nameA;
	/**
	 * @ojb.collection element-class-ref="com.test.dbmodel.ClassB"
	 *                 foreignkey="aid" auto-retrieve="false"
	 *                 auto-update="link" auto-delete="object"
	 *                 orderby="id=ASC"
	 */
	 private  Collection namesB;
	
	 public  ClassA()
	{
		 super ();
	}
	/* next - gettings and settings */
}

И для таблицы В класс 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.
 package  com.test.dbmodel;

/**
 * @ojb.class table="TableB"
 */
 public   class  ClassB
{
	/**
	* @ojb.field primarykey="true" autoincrement="ojb"
	*/
	 private   int  id;
	/**
	 * @ojb.field length="16"
	 */
	 private  String nameB;
	/**
	 * @ojb.field
	 */
	 private   int  aid;
	/**
	 * @ojb.reference class-ref="com.test.dbmodel.ClassA"
	 *                foreignkey="aid" auto-retrieve="false"
	 */
	 private  ClassA nameA;

	 public  ClassB()
	{
		 super ();
	}
	/* next - gettings and settings */
}

Теперь после выполнения определенных запросов Query мы можем манипулировать бинами. Например, если был запрос для бина В, то мы получаем переменную nameA типа ClassA, для которой доступны поля: getId() и getNameA(), а также (!) поле namesB типа Collection, для которого namesB.iterator().next() - это объект типа ClassB (бин В) - понятно, что в коллекции столько их, сколько в таблице В есть строк, в которых aID указывает на нужную нам строку в таблице А.

По своему опыту убедился, что это очень удобно: элементарное обращение к полям бина, ссылки, изменение и т.д. Соответственно, если идут каскадные или перекрестные ссылки для большего количества таблиц, то все они работают точно так же, нюансов практически не существует.

Также почти уверен, что подобная структура существует и в Hibernate.
...
Рейтинг: 0 / 0
Вопрос по Hibernate mapping
    #33937837
IdoL_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruck большое спасибо, но как замапить в hibernate две таблицы отношением many-to-many я знаю. Вопрос в том, как боротья, когда их три? Конечно синтаксис в OJB слегка не такой, но всё по аналогии :))
Неужели никто не сталкивался с такой ситуацией ?

заранее спасибо за возможные способы
...
Рейтинг: 0 / 0
Вопрос по Hibernate mapping
    #33937958
IdoL_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объясню в чём непонимание - если бы связывались две таблицы, например 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>

выручайте :)
...
Рейтинг: 0 / 0
Вопрос по Hibernate mapping
    #33938764
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, получаем нужную тебе связку.

Если это снова не оно, то я тебя просто не понял.
...
Рейтинг: 0 / 0
Вопрос по Hibernate mapping
    #33938855
IdoL_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за вариант, завтра попробую так сделать.
А поля-связки с <pk> - существуют составные PrimaryKey. Собственно в базе именно такие поля и содержатся.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по Hibernate mapping
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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