В прошлой статье мы научились сохранять,редактировать и удалять данные для 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.zip | 21.97 кб |





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