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

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

где в зависимости от типа entType данные брались из разных почти идентичных таблиц с некоторыми изменениями. Причем список полей желательно сделать один для простоты обслуживания. То есть класс в маппинге должен быть один в идеале или же список полей должен наследоваться то есть у класса 2 список полей бужет от класса общего плюс какие то. Решил часть проблемы с помощью entity-name но как выбрать то по entity-name не пользуясь сессиями а queryBuildra ми и критериями. Спасибо
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38208561
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38208677
avalon12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Hibernate замапить три класса на один энтити по условию.
    #38208689
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В мануале описаны разные стратегии. Разберитесь в них и посмотрите какая вам больше подходит.
Проблема в том, что если работать со всеми таблицами, как с одной, то хибернейту как-то надо определять, где искать конкретный экземпляр. Он это сделает либо через SELECT + UNION всех таблиц. Либо можно завести отдельную таблицу, где будет общий для трёх таблиц Id и discriminator, по котрому хибер всегда сможет определить из какой таблицы данный id.
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38208850
avalon12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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

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

findByParam(key,type)

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

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

В основном дело в загоне руководства которое считает что когда все универсально это супер как круто и что если 3 таблицы почти одинаковы то надо один класс и в него пихать все. То есть сокрыть детали бд на самом нижнем уровне а не на уровне сервисов.
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38209496
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hibernate замапить три класса на один энтити по условию.
    #38209521
avalon12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha,

Спасибо за ответ
Да я просто обрисовал почему такие стремление универсиализировать. Все бы хорошо в Вашем примере если бы не одно НО -
должен быть только один универсальный класс, не более одного который бы самим хобером конфигурился в завистмости от таблицы. Спасибо
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38209549
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avalon12,
- если про маппинг, то в хибере он статичный _в общем случае_.
Приведи пример с IBatis
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38209558
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот костыль есть, не уверен, есть ли он в современных версиях hibernate
http://stackoverflow.com/questions/5215471/how-to-map-2-identical-tables-same-properties-to-1-entity
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38209567
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avalon12должен быть только один универсальный класс, не более одного
должен разочаровать твое начальство. вряд ли получится наклонить хибер под свои кривые хотелки - он этого не любит.
...
Рейтинг: 0 / 0
Hibernate замапить три класса на один энтити по условию.
    #38209587
avalon12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Hibernate замапить три класса на один энтити по условию.
    #38209675
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate замапить три класса на один энтити по условию.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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