powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг
8 сообщений из 8, страница 1 из 1
hibernate маппинг
    #33891534
есть таблица в БД. там хранятся проперти типа key - value.
вопрос: можно ли замапить это дело в hibernate так чтобы получить одну энтити с map а не пачку энтитей с двумя пропертями соответсвенно?
...
Рейтинг: 0 / 0
hibernate маппинг
    #33891616
Bring'em all
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
hibernate маппинг
    #33891652
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут правильнее сказать не "можно", а "нужно". Именно так и нужно сделать. Используйте для этого <map>.
...
Рейтинг: 0 / 0
hibernate маппинг
    #33892864
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE TABLE `property1` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  `name` varchar( 10 )  default   NULL ,
  `value` varchar( 20 )  default   NULL ,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=latin1;


    < class  name="PropertyBean" table="Property">
        <id name="id" unsaved-value="0">
            <generator  class ="assigned"/>
        </id>
        <map name="map" table="property1">
            <key column="id"/>
            <index column="name" type="string"/>
            <element column="value" type="string"/>
        </map>
    </ class >


 public   class  PropertyBean {

     private   int  id;
     private  Map map;


     public   int  getId() {
         return  id;
    }

     public   void  setId( int  id) {
         this .id = id;
    }

     public  Map getMap() {
         return  map;
    }

     public   void  setMap(Map map) {
         this .map = map;
    }

}

в результате получается один бин и в map одно значение.
где я не прав?
...
Рейтинг: 0 / 0
hibernate маппинг
    #33893351
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы не совсем верно поняли назначение столбца id в таблице property1. Если Вы делаете его автоинкрементным и первичным ключом, то Вам необходимо добавить property_id как в приведенном примере:

1) Схема БД:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE `property` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=latin1;

CREATE TABLE `property1` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  `property_id`  int ( 11 ) not  null ,
  `name` varchar( 10 )  default   NULL ,
  `value` varchar( 20 )  default   NULL ,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=latin1;

Property:
+----+
| id |
+----+
| 1 |
| 2 |
+----+

Property1:
+----+-------------+--------+--------+
| id | property_id | name | value |
+----+-------------+--------+--------+
| 1 | 1 | prop1 | val1 |
| 2 | 1 | prop2 | val2 |
| 3 | 2 | prop3 | val3 |
| 4 | 2 | prop4 | val4 |
| 5 | 2 | prop5 | val5 |
+----+-------------+--------+--------+
2) Маппинг:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<hibernate-mapping>
        < class  name="domain.PropertyBean" table="Property">
            <id name="id" unsaved-value="0">
                <generator  class ="assigned"/>
            </id>
            <map name="map" table="property1">
                <key column="property_id"/>
                <index column="name" type="string"/>
                <element column="value" type="string"/>
            </map>
    </ class >
</hibernate-mapping>

3) Тестовый класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public   class  Main {

    /**
     * @param args
     */
     public   static   void  main(String[] args) {
        Configuration configuration =  new  Configuration();
        configuration.configure();
        configuration.addClass(PropertyBean. class );

        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();

        PropertyBean bean1 = (PropertyBean) session.load(PropertyBean. class , 1 );
        System.out.println(bean1.getMap().toString());

        PropertyBean bean2 = (PropertyBean) session.load(PropertyBean. class , 2 );
        System.out.println(bean2.getMap().toString());

        session.close();
    }
}

4) Результат:
{prop1=val1, prop2=val2}
{prop3=val3, prop4=val4, prop5=val5}

По-моему вполне нормальный и ожидаемый результат.
...
Рейтинг: 0 / 0
hibernate маппинг
    #33897843
спасибо
всё, получилось.

ещё вопрос в догонку.
хочу замапить ещё одно проперти для PropertyBean, чтобы для каждого бина там было уникальное значение индекса, т.е. короче говоря чтобы можно было однозначно идентифицировать какие проперти хванятся в бине.
можно конечно создать ещё одну таблицу в базе и сделать FK, но хотелось бы узнать можно ли такое сделать средствами hibernate и одной таблице.
вобщем что-то в таком духе должно получиться:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<hibernate-mapping>
        < class  name="domain.PropertyBean" table="Property">
            <id name="id" unsaved-value="0">
                <generator  class ="assigned"/>
            </id>

           <property name="property_id" type="String" />

            <map name="map" table="property1">
                <key column="property_id"/>
                <index column="name" type="string"/>
                <element column="value" type="string"/>
            </map>
    </ class >
</hibernate-mapping>

и вывод:
PropertyBean[0]: property_id = "0", {prop1=val1, prop2=val2}
PropertyBean[1]: property_id = "1", {prop3=val3, prop4=val4, prop5=val5}
...
Рейтинг: 0 / 0
hibernate маппинг
    #33898729
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не надо ничего дополнительно мапить и создавать таблицы. То, что Вы написали в маппинге (<property name="property_id" type="String" />), по-моему, не имеет смысла. У вас же есть id объекта!!!
Попробуйте такой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public   class  Main {

    /**
     * @param args
     */
     public   static   void  main(String[] args) {
        Configuration configuration =  new  Configuration();
        configuration.configure();
        configuration.addClass(PropertyBean. class );

        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();

        PropertyBean bean1 = (PropertyBean) session.load(PropertyBean. class , 1 );
        System.out.println("id="+bean1.getId()+", map="+bean1.getMap().toString());

        PropertyBean bean2 = (PropertyBean) session.load(PropertyBean. class , 2 );
        System.out.println("id="+bean2.getId()+", map="+bean2.getMap().toString());

        session.close();
    }
}

Получится:
id=1, map={prop1=val1, prop2=val2}
id=2, map={prop3=val3, prop4=val4, prop5=val5}

Или Вам что-то другое нужно? Может я не правильно вопрос понял?
...
Рейтинг: 0 / 0
hibernate маппинг
    #33899264
да, всё верно, но хотелось бы обойтись вообще без вот этой таблицы

Код: plaintext
1.
2.
3.
4.
CREATE TABLE `property` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=latin1;

и использовать property_id из этой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `property1` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  `property_id`  int ( 11 ) not  null ,
  `name` varchar( 10 )  default   NULL ,
  `value` varchar( 20 )  default   NULL ,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=latin1;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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