Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate замапить три класса на один энтити по условию. / 16 сообщений из 16, страница 1 из 1
02.04.2013, 11:09:18
    #38208549
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
Здравствуйте. Есть вопрос. Необходимо реализовать следующее в хибернейте.

List<MyEnt> ents=findByCriteria1(Integer primaryKey,Integer entType)

где в зависимости от типа entType данные брались из разных почти идентичных таблиц с некоторыми изменениями. Причем список полей желательно сделать один для простоты обслуживания. То есть класс в маппинге должен быть один в идеале или же список полей должен наследоваться то есть у класса 2 список полей бужет от класса общего плюс какие то. Решил часть проблемы с помощью entity-name но как выбрать то по entity-name не пользуясь сессиями а queryBuildra ми и критериями. Спасибо
...
Рейтинг: 0 / 0
02.04.2013, 11:11:53
    #38208561
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
...
Рейтинг: 0 / 0
02.04.2013, 11:51:21
    #38208677
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
Blazkowicz,

Спасибо за ответ. А как выбрать по entity-name через query builder и т д?

<class name="..."

<subclass name="..." entity-name="ent1"...

<subclass name="..." entity-name="ent2"...

<subclass name="..." entity-name="ent3"...

как выбрать из ent3? Спасибо
...
Рейтинг: 0 / 0
02.04.2013, 11:55:17
    #38208689
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
В мануале описаны разные стратегии. Разберитесь в них и посмотрите какая вам больше подходит.
Проблема в том, что если работать со всеми таблицами, как с одной, то хибернейту как-то надо определять, где искать конкретный экземпляр. Он это сделает либо через SELECT + UNION всех таблиц. Либо можно завести отдельную таблицу, где будет общий для трёх таблиц Id и discriminator, по котрому хибер всегда сможет определить из какой таблицы данный id.
...
Рейтинг: 0 / 0
02.04.2013, 12:52:54
    #38208850
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
Blazkowicz,

Спасибо за ответ. Так в том то все и дело что я ему передаю параметр и на основании его он должен определить с какой таблицы тянуть. Для этого кстати подходит entity-id. Может имеет смысл создать составной ключ из ид и типа таблицы? И вообще с вашей точки зрения в случае когда имеем 3 таблицы и попеременно выбираем с каждой из них без юнионов и т д что лучше сделать? Три отдельные таблицы? Спасибо
...
Рейтинг: 0 / 0
02.04.2013, 14:54:31
    #38209225
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12,
- наследование обязательно нужно?
Т.к. когда 3-4-5 справочников в БД объединяют в одну большую-большую таблицу, то профит получают небольшой.
Что 3 отдельных почти одинаковых таблицы, что одна большая суперТаблица - одинаково.
...
Рейтинг: 0 / 0
02.04.2013, 15:31:25
    #38209312
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
Petro123,

В том то и дело что наследование не надо это 3 по смыслу одинаковые таблицы со слегка разной структурой. Нужен один класс для работы с ними, для легкости доступа. Изменить что либо в существующей системе невозможно поэтому обьединять таблицы никто не будет. Нужен интерфейс типа

findByParam(key,type)

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

где type - какой таблицы брать а key - первичный ключ там. В iBatis это реализовано более чем просто и тока в хибере сразу проблема. Помогите как это можно сделать. Спасибо
...
Рейтинг: 0 / 0
02.04.2013, 16:02:20
    #38209413
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12где type - какой таблицы брать а key - первичный ключ там. В iBatis это реализовано более чем просто и тока в хибере сразу проблема
казалось бы, что стоит в findByCriteria1 сделать простой switch (type) и в зависимости от него создавать критерий по Entity1...3, а потом добавлять общие критерии? или сделать на генериках, передавая прямо Enitity.class вместо type?
...
Рейтинг: 0 / 0
02.04.2013, 16:12:24
    #38209449
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
chpasha,

В основном дело в загоне руководства которое считает что когда все универсально это супер как круто и что если 3 таблицы почти одинаковы то надо один класс и в него пихать все. То есть сокрыть детали бд на самом нижнем уровне а не на уровне сервисов.
...
Рейтинг: 0 / 0
02.04.2013, 16:24:05
    #38209496
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12chpasha,

да не надо на зеркало пенять, я тебе про решение задачи, а ты мне про руководство.

Код: java
1.
2.
3.
4.
5.
6.
public <T extends Entity> T findByID(Integer id, Class<T> entityClass) {
         return (T) sessionFactory.getCurrentSession()
                                          .createCriteria(entityClass)
                                          .add(Restrictions.eq("id", id))
                                          .uniqueResult();
}


маппинг выбираем между Table per concrete class и Table per subclass в зависимости от структуры таблиц
...
Рейтинг: 0 / 0
02.04.2013, 16:31:28
    #38209521
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
chpasha,

Спасибо за ответ
Да я просто обрисовал почему такие стремление универсиализировать. Все бы хорошо в Вашем примере если бы не одно НО -
должен быть только один универсальный класс, не более одного который бы самим хобером конфигурился в завистмости от таблицы. Спасибо
...
Рейтинг: 0 / 0
02.04.2013, 16:39:42
    #38209549
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12,
- если про маппинг, то в хибере он статичный _в общем случае_.
Приведи пример с IBatis
...
Рейтинг: 0 / 0
02.04.2013, 16:42:11
    #38209558
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
вот костыль есть, не уверен, есть ли он в современных версиях hibernate
http://stackoverflow.com/questions/5215471/how-to-map-2-identical-tables-same-properties-to-1-entity
...
Рейтинг: 0 / 0
02.04.2013, 16:44:19
    #38209567
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12должен быть только один универсальный класс, не более одного
должен разочаровать твое начальство. вряд ли получится наклонить хибер под свои кривые хотелки - он этого не любит.
...
Рейтинг: 0 / 0
02.04.2013, 16:52:01
    #38209587
avalon12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
Petro123,


Спасибо за ответ. Вот пример
Код: xml
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.
38.
39.
40.
41.
42.
43.
<resultMap id="person-result" class="Person">
        //common properties
        <result property="code" column="code"/>
        //additional depending on column value
        <discriminator javaType="java.lang.Integer" column="entity_type">
            <subMap value="1" resultMap="entity1-result"/>
            <subMap value="2" resultMap="entity2-result"/>
            <subMap value="3" resultMap="entity3-result"/>
        </discriminator>
</resultMap>

<sql id="common-fields">
//common fields
</sql>

<sql id="entity1-fields">
//common fields
</sql>

<sql id="entity2-fields">
//cusrom fields
</sql>

<sql id="entity3-fields">
//custom fields
</sql>

<sql id="table-fragment">
        <isEqual property="entityType"
                 compareValue="1">
            table1
        </isEqual>

        <isEqual property="entityType"
                 compareValue="2">
            table2
        </isEqual>

        <isEqual property="entityType"
                 compareValue="3">
            table3
        </isEqual>
    </sql>



выбор таблицы, набора колонок, полей производится в зависимости от значения поля entityType все это подставляется в свой резалтмап но энтити один
...
Рейтинг: 0 / 0
02.04.2013, 17:17:55
    #38209675
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate замапить три класса на один энтити по условию.
avalon12,
мммм
может тут покопать на предмет инициализации хибера

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
package dao;

import main.Main;// пакет с DAO

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HibernateUtil {
	private static SessionFactory factory;

	public static Configuration getInitializedConfiguration() {
		AnnotationConfiguration config = new AnnotationConfiguration();
		/* !!!!!!!!!!!!!!   // пакет с DAO */
		config.addAnnotatedClass(Book.class);
		config.addAnnotatedClass(Autor.class);
		config.configure();
		return config;
	}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate замапить три класса на один энтити по условию. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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