Hibernate 3 Mapping collections

В прошлой статье мы научились сохранять,редактировать и удалять данные для 1 таблицы БД, но часто на практике встречается что нам нужно извлечь данные из нескольких таблиц связанные между собой некоторым ключем(foregen key). В hibernate все это можно сделать при помощи collections(list, map, set).
Немножко теории:
    Интерфейс List хранит последовательность элементов, они могут быть вставлены или извлечены с помощью их позиции в списке отсчитываемым от нуля индексом, список может содержать дублированные элементы. Интерфейс Set похож на List  но он не допускает дублирования элементов. Интерфейс Map отображает уникальные  ключи в значения, ключ это произвольный объект который вы испотзуете для отыскания соответствующего значения. Нам так же понадобится понимание некоторых постулатов которые вводятся hibernate: а именно понятий one-to-one, one-to-many, many-to-one, many-to-many.

Hibernate Unidirectional One to One Association Mapping

One-to-one - однонаправленная связь между двумя записями в разных таблицах,
связанные между собой по определенному полю, 1 запись данных в 1 таблице связана с 1
записью в другой и только одной. Например Человек может иметь только 1 адрес где он
прописан. Поля по которым связаны записи таблиц, ВСЕГДА имеют уникальные значения(primary key
или unique key).
table Persons                 table Adress
id  firstName lastName       id    Street
1   Vit       Lo             1     Лененский пр. д.1 кв 1
2   Mabel     Po             2     Лененский пр. д.2 кв 2
.....
В данном примере связь идет по Person.id=Adress.id.
CREATE TABLE `persons` (
  `id` int(11) NOT NULL auto_increment,
  `firstName` varchar(20) default NULL,
  `lastName` varchar(20) default NULL,
  `BirthDate` date default NULL,
  `telephonId` int(11) default NULL,
  PRIMARY KEY  (`id`) -- связь по полю persons.id
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `adress` (
  `id` int(11) NOT NULL auto_increment,
  `street` varchar(40) default NULL,
  PRIMARY KEY  (`id`) -- связь по полю adress.id
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Напишем pojo-объекты

public class Adress {
    private Integer id;
    private String adress;

    public Adress() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getAdress() {
        return adress;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }
}

public class Person {
    private Integer id;
    private String firstName;
    private String lastName;
    private Date birthDate;
    //  доступ  к pojo-объект Adress
    private Adress adress;

    public Adress getAdress() {
        return adress;
    }
    public void setAdress(Adress adress) {
        this.adress = adress;
    }
    public Person() {
    }
    ....
    getter & setter
    .....
}

Mapping pojo-объектов:

<hibernate-mapping >
   <class name="org.vit.domain.Adress"  table="Adress" >
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <property name="adress" type="string" column="street" />
   </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="org.vit.domain.Person" table="Persons" lazy="true">
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="firstName" type="string" column="firstName"/>
        <property name="lastName" type="string" column="lastName"/>
        <property name="birthDate" type="date" column="BirthDate"/>
        // наша связь
        <one-to-one name="adress"
                    class="org.vit.domain.Adress"
                />
</hibernate-mapping>
Пример:
   ....
   public static void main(String[] args) {
   Session session = HibernateUtil.getSessionFactory().getCurrentSession();
   Transaction tx = session.beginTransaction();
   try {
      // получаем pojo-объект
      Person p2 = (Person) session.load(Person.class, 1);
      //  выводим данные ФИО
      System.out.println(p2.getFirstName() + " " + p2.getLastName()
      // выводим адресс прописки
+ " " + p2.getAdress().getAdress());
tx.commit();
....

Hibernate Association Mappings: Many - To - One

Расмотренный ранее пример - это идеальный случай когда в 1 квартире прописан 1 человек, в реальности в 1 квартире прописана 1 семья (Many - Person's :) ). 
  Many-to-one - однонаправленная связь между множеством записей в первой таблице, связанные с одной записью во второй. Нужно сказать что запись формируется тупо НЕ УНИКАЛЬНЫМ foregen key.

Добавим в таблицу Persons поле adressId и foregen key
CONSTRAINT `persons_ibfk_1` FOREIGN KEY (`adressId`) REFERENCES `adress` (`id`)
  Расморим данные, записи с id = 1,3,4 таблице Persons ссылаются на одну и ту же запись в таблице Adress:

table Persons                             table Adress
id  firstName     lastName  adressId     id    Street
1   Vit           Lo        1            1     Лененский пр. д.1 кв 1
2   Mabel         Po        2            2     Лененский пр. д.2 кв 2
3   Mother'sVit   Lo        1            3     Лененский пр. д.3 кв 3
4   Brother'sVit  Lo        1            4     Лененский пр. д.4 кв 4
..... 

Нам понадобится главная табица Persons:

CREATE TABLE `persons` (
`id` int(11) NOT NULL auto_increment,
`firstName` varchar(20) default NULL,
`lastName` varchar(20) default NULL,
`BirthDate` date default NULL,
`telephonId` int(11) default NULL,
`adressId` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `adressId` (`adressId`),
CONSTRAINT `persons_ibfk_1`
FOREIGN KEY (`adressId`) REFERENCES `adress` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE -- связь по полю persons.adressId
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `adress` (
`id` int(11) NOT NULL auto_increment,
`street` varchar(40) default NULL,
PRIMARY KEY (`id`) -- связь по полю adress.id
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Напишем pojo-объекты

public class Adress {
private Integer id;
private String adress;

public Adress() {
}

public Integer getId() {
return id;
}

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

public String getAdress() {
return adress;
}

public void setAdress(String adress) {
this.adress = adress;
}
}

public class Person {
private Integer id;
private String firstName;
private String lastName;
private Date birthDate;
// доступ к pojo-объекту Adress
private Adress adress;

public Adress getAdress() {
return adress;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
public Person() {
}
....
getter & setter
.....
}

Mapping pojo-объектов:

<hibernate-mapping >
<class name="org.vit.domain.Adress" table="Adress" >
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="adress" type="string" column="street" />
</class>
</hibernate-mapping>

<hibernate-mapping>
<class name="org.vit.domain.Person" table="Persons" lazy="true">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" type="string" column="firstName"/>
<property name="lastName" type="string" column="lastName"/>
<property name="birthDate" type="date" column="BirthDate"/>
<!-- наша связь  -->
<many-to-one name="adress"
<!-- наш pojo-объект -->
class="org.vit.domain.Adress"
<!-- foregen key -->
column="adressId"
<!-- поле не содержит null-->
not-null="true"
/>
</hibernate-mapping>
Пример:
....
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
// выполняем программу 3 раза получаем pojo-объекты 1, 2, 3
Person p2 = (Person) session.load(Person.class, 1);// .load(Person.class, 2); .load(Person.class, 3);
// выводим данные ФИО
System.out.println(p2.getFirstName() + " " + p2.getLastName()
// выводим адресс прописки
+ " " + p2.getAdress().getAdress());
tx.commit();
....

Вывод :
many to one
1) Vit Lo Лененский пр. д.1 кв 1
2) Mother'sVit Lo Лененский пр. д.1 кв 1
3) Brother'sVit Lo Лененский пр. д.1 кв 1

Mapping a set

Интерфейс java.util.Set маппится элементом <set>, и инициализируется коллекцией java.util.HashSet, элементы в Set идут не отсортированными, и нет одинаковых значений. Давайте расмотрим пример, для начала создадим две таблицы item, и item_image, использую БД MS SQL Server 2005.

CREATE TABLE [dbo].[item] (
[item_id] int IDENTITY(1, 1) NOT NULL,
[name] varchar(20) COLLATE Cyrillic_General_CI_AS NULL,
PRIMARY KEY CLUSTERED ([item_id])
)
ON [PRIMARY]
GO

CREATE TABLE [dbo].[item_image] (
[itemimage_id] int NOT NULL,
[filename] varchar(20) COLLATE Cyrillic_General_CI_AS NULL,
[id] int NOT NULL,
CONSTRAINT [item_image_pk] PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

Таблица item содержит имена людей, в таблице item_image содержатся
имена файлов принадлежащих этим людям, расмотрим данные содержащиеся
в этих таблицах, связь идет по полям Item.item_id = item_image.itemimage_id:

item_id   name      id  itemimage_id filename
1         Vit       1   1            Vitimage1.jpg 
2         Mabel     2   1            Vitimage2.jpg 
3         Vit2      3   2            Mabelimage1.jpg 
                    4   1            Vitimage2.jpg 
...

Напишем pojo-объекты

package org.vit.domain;

public class ItemImage {
private Integer id;
private Integer itemimage_id;
private String filename;

public ItemImage() {
}

public Integer getId() {
return id;
}

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

public Integer getItemimage_id() {
return itemimage_id;
}

public void setItemimage_id(Integer itemimage_id) {
this.itemimage_id = itemimage_id;
}

public String getFilename() {
return filename;
}

public void setFilename(String filename) {
this.filename = filename;
}
}

package org.vit.domain;

import java.util.Set;
import java.util.HashSet;

public class Item {
private Integer id;
private String name;
// сдесь нужно инициализировать пустой объект Set
private Set<ItemImage> images = new HashSet();

// конструктор по умолчанию.
public Item() {
}

// getter's & setter's

public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Set<ItemImage> getImages() {
return images;
}

public void setImages(Set<ItemImage> images) {
this.images = images;
}
}

Mapping pojo-объектов:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping >
<class name="org.vit.domain.ItemImage" table="item_image" >
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="itemimage_id" type="int" column="itemimage_id"/>
<property name="filename" type="string" column="filename" />
</class>
</hibernate-mapping>

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping >
<class name="org.vit.domain.Item"  table="item" >
<id name="id" type="int" column="item_id">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" />
<!-- поле images pojo-объекта Item -->
<set name="images" table="item_image">
<!-- Какие элементы попадут в Set, выборка идет по полю
itemimage_id -->
<key column="itemimage_id"/>
<!--  Set-Элементы будут содержать значения столбца filename -->
<element type="string" column="filename" not-null="true"/>
</set>
</class>
</hibernate-mapping>

Считываем данные:
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
//получаем pojo-объект Item
Item p2 = (Item) session.load(Item.class, 1);
if (p2 != null)
//выводим имя пользователя и принадлежащие ему данные
System.out.println(p2.getName() + " "
+p2.getImages().toString());
tx.commit();

} catch (HibernateException e) {
System.out.println("Hello it is Exception");
//tx.rollback();
} finally {
if (session.isOpen()) session.close();
}
}

При этом hibernate формирует автоматически sql запросы:
Hibernate: select item0_.item_id as item1_0_0_, item0_.name as name0_0_ from item item0_ where item0_.item_id=1
1 Vit
Hibernate: select images0_.itemimage_id as itemimage2_0_, images0_.filename as filename0_ from item_image images0_ where images0_.itemimage_id=1

1 Vitimage1.jpg
1 Vitimage2.jpg
1 Vitimage2.jpg 

Вывод программы Без Дублирующих значений (Set interface)
Vit [Vitimage1.jpg, Vitimage2.jpg]

Mapping a list

Интерфейс java.util.List маппится элементом <list>, и инициализируется коллекцией
java.util.ArrayList, элементы в List идут не отсортированными, каждый элемент
имеет свою позицию которая определяется индексом, List может имет одинаковые
значеня элементов. Давайте расмотрим пример, для начала добавим поле в таблицу
item_image - listIndex позиция в нашем List'е:

CREATE TABLE [dbo].[item_image] (
[itemimage_id] int NOT NULL,
[filename] varchar(20) COLLATE Cyrillic_General_CI_AS NULL,
[id] int NOT NULL,
[listIndex] int NULL,
CONSTRAINT [item_image_pk] PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

Напомню еще раз что, таблица item содержит имена людей, в таблице item_image содержатся имена файлов принадлежащих этим людям, расмотрим данные содержащиеся в этих таблицах, связь идет по полям Item.item_id = item_image.itemimage_id:

item_id   name      id  itemimage_id listIndex      filename
1         Vit       1   1                0          Vitimage1.jpg 
2         Mabel     2   1                1          Vitimage2.jpg 
3         Vit2      3   2                0          Mabelimage1.jpg 
                    4   1                2          Vitimage2.jpg 
...

Напишем pojo-объекты

package org.vit.domain;

public class ItemImage {
private Integer id;
private Integer itemimage_id;
private String filename;
// добавим поле listIndex + getter & setter
private Integer listIndex; public ItemImage() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
}
public Integer getItemimage_id() {
return itemimage_id;
} public void setItemimage_id(Integer itemimage_id) {
this.itemimage_id = itemimage_id;
} public String getFilename() {
return filename;
} public void setFilename(String filename) {
this.filename = filename;
} public Integer getListIndex() {
return listIndex;
} public void setListIndex(Integer listIndex) {
this.listIndex = listIndex;
}
}public class Item {
private Integer id;
private String name;
/*// <set>
private Set<ItemImage> images = new HashSet();*/
// <list> создадим List + getter & setter
private List<ItemImage> images = new ArrayList(); public Item() {
}
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //<list> public List<ItemImage> getImages() {
return images;
} public void setImages(List<ItemImage> images) {
this.images = images;
} /*//<set>
public Set<ItemImage> getImages() {
return images;
} public void setImages(Set<ItemImage> images) {
this.images = images;
} */
}Mapping pojo-объектов:<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping >
<class name="org.vit.domain.ItemImage"  table="item_image" >
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="itemimage_id" type="int" column="itemimage_id"/>
<property name="filename" type="string" column="filename" />
<!-- добaвили индекс list'a -->
<property name="listIndex" type="int" column="listIndex"/>
</class>
</hibernate-mapping>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping >
<class name="org.vit.domain.Item"  table="item" >
<id name="id" type="int" column="item_id">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" />      <!-- поле images pojo-объекта Item -->
<list name="images" table="item_image">
<!-- Какие элементы попадут в List, выборка идет по полю
itemimage_id -->
<key column="itemimage_id"/>
<!-- определяет поле в таблице item_image значения которых будет
индексом  List'a -->
<list-index column="listIndex" />
<!--  List-Элементы будут содержать значения столбца filename -->
<element type="string" column="filename" not-null="true"/>
</list>
<!--
<set name="images" table="item_image">
<key column="itemimage_id"/>
<element type="string" column="filename" not-null="true"/>
</set>
-->
</class>
</hibernate-mapping>

Считываем данные:
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
//получаем pojo-объект Item
Item p2 = (Item) session.load(Item.class, 1);
if (p2 != null)
//выводим имя пользователя и принадлежащие ему данные
System.out.println(p2.getName() + " "
+p2.getImages().toString());
tx.commit();

} catch (HibernateException e) {
System.out.println("Hello it is Exception");
//tx.rollback();
} finally {
if (session.isOpen()) session.close();
}
}

При этом hibernate формирует автоматически sql запросы:
Hibernate: select item0_.item_id as item1_0_0_, item0_.name as name0_0_ from item item0_ where item0_.item_id=1
1 Vit
Hibernate: select images0_.itemimage_id as itemimage2_0_, images0_.filename as filename0_, images0_.listIndex as listIndex0_ from item_image images0_ where images0_.itemimage_id=1

1 Vitimage1.jpg 0
1 Vitimage2.jpg 1
1 Vitimage2.jpg 2

Вывод программы с дублирующими значениями:
Vit [Vitimage1.jpg, Vitimage2.jpg, Vitimage2.jpg]

Mapping a map

Интерфейс java.util.Map маппится элементом <map>, и инициализируется коллекцией java.util.HashMap, элементы в Map идут не отсортированными, каждый элемент имеет свою позицию которая определяется ключом (на основе хеша), Map может иметь  одинаковые значения элементов. Давайте расмотрим пример, для начала добавим поле в таблицу item_image - mapKey, ключ в нашей Map'е:

CREATE TABLE [dbo].[item_image] (
[itemimage_id] int NOT NULL,
[filename] varchar(20) COLLATE Cyrillic_General_CI_AS NULL,
[id] int NOT NULL,
[listIndex] int NULL,
[mapKey] varchar(20) COLLATE Cyrillic_General_CI_AS NULL,
CONSTRAINT [item_image_pk] PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

Как мы все прекрасно помним, таблица item содержит имена людей, в таблице item_image содержатся имена файлов принадлежащих этим людям, расмотрим данные содержащиеся в этих таблицах, связь идет по полям Item.item_id = item_image.itemimage_id:

item_id   name      id  itemimage_id listIndex mapKey         filename
1         Vit       1   1                0     vitMapKey1     Vitimage1.jpg 
2         Mabel     2   1                1     vitMapKey2     Vitimage2.jpg  
3         Vit2      3   2                0     MabelMapKey1   Mabelimage1.jpg
                    4   1                2     vitMapKey3     Vitimage2.jpg 
...

Напишем pojo-объекты

package org.vit.domain;

public class ItemImage {
private Integer id;
private Integer itemimage_id;
private String filename;
private Integer listIndex;
// добавим наш ключ + getter & setter
private String mapKey;

public ItemImage() {
}

public Integer getId() {
return id;
}

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

public Integer getItemimage_id() {
return itemimage_id;
}

public void setItemimage_id(Integer itemimage_id) {
this.itemimage_id = itemimage_id;
}

public String getFilename() {
return filename;
}

public void setFilename(String filename) {
this.filename = filename;
}

public Integer getListIndex() {
return listIndex;
}

public void setListIndex(Integer listIndex) {
this.listIndex = listIndex;
}

public String getMapKey() {
return mapKey;
}

public void setMapKey(String mapKey) {
this.mapKey = mapKey;
}
}


package org.vit.domain;

import java.util.*;

public class Item {
private Integer id;
private String name;
/*// <set>
private Set<ItemImage> images = new HashSet();*/
/* // <list>
private List<ItemImage> images = new ArrayList();*/
// <map> создадим Map + getter & setter
private Map images = new HashMap();

public Item() {
}

public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/*//<list>
public List<ItemImage> getImages() {
return images;
}

public void setImages(List<ItemImage> images) {
this.images = images;
} */

/*//<set>
public Set<ItemImage> getImages() {
return images;
}

public void setImages(Set<ItemImage> images) {
this.images = images;
} */
// <map>

public Map getImages() {
return images;
}

public void setImages(Map images) {
this.images = images;
}
}

Mapping pojo-объектов:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping >
<class name="org.vit.domain.ItemImage" table="item_image" >
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="itemimage_id" type="int" column="itemimage_id"/>
<property name="filename" type="string" column="filename" />
<property name="listIndex" type="int" column="listIndex"/>
<!-- добавили новое поле - mapKey -->
<property name="mapKey" type="string" column="mapKey"/>
</class>
</hibernate-mapping>

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE
hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping >
<class name="org.vit.domain.Item"  table="item" >
<id name="id" type="int" column="item_id">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" />
<!-- поле images pojo-объекта Item -->
<map name="images" table="item_image">
<!-- Какие элементы попадут в Map, выборка идет по полю
itemimage_id -->
<key column="itemimage_id"/>
!-- определяет поле в таблице item_image значения которых будет
ключами для Map'a -->
<map-key type="string" column="mapKey"/>
<!-- Map-Элементы будут содержать значения столбца filename -->
<element type="string" column="filename" not-null="true"/>
</map>
</class>
</hibernate-mapping>
Считываем данные:
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
//получаем pojo-объект Item
Item p2 = (Item) session.load(Item.class, 1);
if (p2 != null)
//выводим имя пользователя и принадлежащие ему данные
System.out.println(p2.getName() + " "
+p2.getImages().toString());
tx.commit();

} catch (HibernateException e) {
System.out.println("Hello it is Exception");
//tx.rollback();
} finally {
if (session.isOpen()) session.close();
}
}

При этом hibernate формирует автоматически sql запросы:
Hibernate: select item0_.item_id as item1_0_0_, item0_.name as name0_0_ from item item0_ where item0_.item_id=1
1 Vit
Hibernate: select images0_.itemimage_id as itemimage2_0_, images0_.filename as filename0_, images0_.mapKey as mapKey0_ from item_image images0_ where images0_.itemimage_id=?

1 Vitimage1.jpg 0 vitMapKey1
1 Vitimage2.jpg 1 vitMapKey2
1 Vitimage2.jpg 2 vitMapKey3

Вывод программы с дублирующими значениями:
Vit {vitMapKey2=Vitimage2.jpg, vitMapKey3=Vitimage2.jpg, vitMapKey1=Vitimage1.jpg}

One-to-many

Все 3 предыдущих примера вытаскивали из БД только одно поле item_image.filename
а что если нам нужно вытащить весь pojo-объект, для <set> мы просто добавляем строчку
<one-to-many class="org.vit.domain.ItemImage" /> и все:

<hibernate-mapping >
<class name="org.vit.domain.Item" table="item" >
<id name="id" type="int" column="item_id">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" />

<set name="images" table="item_image">
<key column="itemimage_id"/>
<!-- указываем что нам нужны pojo-объекты ItemImage -->
<one-to-many class="org.vit.domain.ItemImage" />
<!--<element type="string" column="filename" not-null="true"/>-->
</set>
</class>
</hibernate-mapping>

  PS я использовал для 2-х первых примеров БД mysql(писал дома), потом перешел на MS SQL 2005 (писал во время обеда :) ) стоимость перехода всего-лишь - поменял драйвер и 5 строчек в hibernate.cfg.xml вот такая кросс-платформенность Баз Данных:

<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="connection.url">jdbc:jtds:sqlserver://kamaz-srv3:1433/shtat;tds=8.0;lastupdatecount=true</property>
<property name="connection.username">lopanov</property>
<property name="connection.password">secret</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>

 

ВложениеРазмер
hibernat3_3.zip21.97 кб

Отправить комментарий

КАПЧА
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Enter the characters shown in the image.