Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг / 8 сообщений из 8, страница 1 из 1
01.08.2006, 12:30
    #33891534
hibernate маппинг
есть таблица в БД. там хранятся проперти типа key - value.
вопрос: можно ли замапить это дело в hibernate так чтобы получить одну энтити с map а не пачку энтитей с двумя пропертями соответсвенно?
...
Рейтинг: 0 / 0
01.08.2006, 12:54
    #33891616
Bring'em all
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг
...
Рейтинг: 0 / 0
01.08.2006, 13:04
    #33891652
pretender
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг
Тут правильнее сказать не "можно", а "нужно". Именно так и нужно сделать. Используйте для этого <map>.
...
Рейтинг: 0 / 0
01.08.2006, 18:01
    #33892864
hibernate маппинг
Код: 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
02.08.2006, 07:28
    #33893351
pretender
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг
Вы не совсем верно поняли назначение столбца 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
03.08.2006, 16:17
    #33897843
hibernate маппинг
спасибо
всё, получилось.

ещё вопрос в догонку.
хочу замапить ещё одно проперти для 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
04.08.2006, 06:59
    #33898729
pretender
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг
Не надо ничего дополнительно мапить и создавать таблицы. То, что Вы написали в маппинге (<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
04.08.2006, 11:27
    #33899264
hibernate маппинг
да, всё верно, но хотелось бы обойтись вообще без вот этой таблицы

Код: 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
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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