Hibernate Association Mapping
Java Fast Track www.javafasttrack.com
Copyright 2010 Purple Desk All Rights Reserved. PurpleDesk.and its logo are Trademarks of Purple Desk.www.javafasttrack.com
Collection Types in Hibernate
Bag A <bag> is an unordered collection, which can contain duplicated elements. That means if you persist a bag with some order of elements, you cannot expect the same order retains when the collection is retrieved. Example public class Category { ... private List subcategory; } <hibernate-mapping package="com.jft.Category"> <class name="Category" table="Category"> ... <bag name="subcategorys" table="Category_subcategory"> <key column="Category_ID" /> <element column="subcategory" type="string" length="100" /> </bag> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
Set A <set> is very similar to a <bag>. The only difference is that set can only store unique objects. That means no duplicated elements can be contained in a set. When you add the same element to a set for second time, it will replace the old one. A set is unordered by default but we can ask it to be sorted, public class Category { ... private Set subcategorys; } <hibernate-mapping package="com.jft.Category"> <class name="Category" table="Category"> ... <set name="subcategorys" table="Category_subcategory"> <key column="Category_ID" /> <element column="subcategory" type="string" length="100" /> </set> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
List A <list> is an indexed collection where the index will also be persisted. That means we can retain the order of the list when it is retrieved. It differs from a <bag> for it persists the element index while a <bag> does not. The corresponding type of a <list> in Java is java.util.List. public class Category { ... private List subcategorys; } <hibernate-mapping package="com.jft.Category"> <class name="Category" table="Category"> ... <list name="subcategorys" table="Category"> <key column="Category_ID" /> <list-index column="subcategory_INDEX"/> <element column="subcategory" type="string" length="100" /> </list> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
Array An <array> has the same usage as a <list>. The only difference is that it corresponds to an array type in Java, not a java.util.List. It is seldom used unless we are mapping for legacy applications. public class Category { ... private String[] subcategorys; } <hibernate-mapping package="com.jft.Category"> <class name="Category" table="Category"> ... <array name="subcategorys" table="Category"> <key column="Category_ID" /> <list-index column="subcategory_INDEX"/> <element column="subcategory" type="string" length="100" /> </array> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
Map A <map> is very similar to a <list>. The difference is that a map uses arbitrary keys to index the collection, not an integer index using in a list. public class Category { ... private Map subcategorys; } <hibernate-mapping package="com.jft.Category"> <class name="Category" table="Category"> ... <map name="subcategorys" table="Category_subcategory"> <key column="Category_ID" /> <map-key column="subcategory_KEY" type="string" /> <element column="subcategory" type="string" length="100" /> </map> </class> Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com </hibernate-mapping>
One to One Mapping
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
One to Many Mapping
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
Many to Many Mapping
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
10
create table `jftsampledb`.`category2`( `catid` int not null, `catname` varchar(30), primary key (`catid`) );
create table `jftsampledb`.`subcategory2`( `subcatid` int not null, `subcatname` varchar(50), `catfk` int unique, primary key (`subcatid`) );
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
11
<hibernate-mapping> <class name="com.jft.demo.Category2" table="category2" catalog="jftsampledb"> <id name="catid" type="java.lang.Integer"> <column name="catid" /> <generator class="assigned" /> </id> <property name="catname" type="java.lang.String"> <column name="catname" length="30" /> </property> <set name="subcategory2s" inverse="true"> <key> <column name="catfk" unique="true" /> </key> <one-to-many class="com.jft.demo.Subcategory2" /> </set> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
12
<hibernate-mapping> <class name="com.jft.demo.Subcategory2" table="subcategory2" catalog="jftsampledb"> <id name="subcatid" type="java.lang.Integer"> <column name="subcatid" /> <generator class="assigned" /> </id> <many-to-one name="category2" class="com.jft.demo.Category2" fetch="select"> <column name="catfk" unique="true" /> </many-to-one> <property name="subcatname" type="java.lang.String"> <column name="subcatname" length="50" /> </property> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
13
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
14
create table `jfthibernate`.`category`( `CATEGORY_ID` int unsigned not null auto_increment, `NAME` varchar(10) not null, `DESC` varchar(255) not null, primary key (`CATEGORY_ID`) ); create table `jfthibernate`.`stock`( `STOCK_ID` int unsigned not null auto_increment, `STOCK_CODE` varchar(10) not null unique, `STOCK_NAME` varchar(20) not null unique, primary key (`STOCK_ID`) ); create table `jfthibernate`.`stock_category`( `STOCK_CATEGORY_ID` int unsigned not null auto_increment, `STOCK_ID` int unsigned not null, `CATEGORY_ID` int unsigned not null, primary key (`STOCK_CATEGORY_ID`) ); alter table `jfthibernate`.`stock_category` add index `FK_STOCK_CATEGORY_STOCK_ID`(`STOCK_ID`), add constraint `FK_STOCK_CATEGORY_STOCK_ID` foreign key (`STOCK_ID`) references `jfthibernate`.`stock`(`STOCK_ID`);
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
15
<hibernate-mapping> <class name="com.jft.common.Category" table="category" catalog="jfthibernate"> <id name="categoryId" type="java.lang.Integer"> <column name="CATEGORY_ID" /> <generator class="identity" /> </id> <property name="name" type="string"> <column name="NAME" length="20" not-null="true" /> </property> <property name="desc" type="string" > <column name="[DESC]" length="255" not-null="true" /> </property> <!-- fetch="select" --> <set name="stockCategories" inverse="true" lazy="true" table="stock_category" > <key> <column name="CATEGORY_ID" not-null="true" /> </key> <one-to-many class="com.jft.common.StockCategory" /> </set> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
16
<hibernate-mapping> <class name="com.jft.common.Stock" table="stock" catalog="jfthibernate"> <id name="stockId" type="java.lang.Integer"> <column name="STOCK_ID" /> <generator class="identity" /> </id> <property name="stockCode" type="string"> <column name="STOCK_CODE" length="10" not-null="true" unique="true" /> </property> <property name="stockName" type="string"> <column name="STOCK_NAME" length="20" not-null="true" unique="true" /> </property> <set name="stockCategories" inverse="true" lazy="true" table="stock_category" > <key> <column name="STOCK_ID" not-null="true" /> </key> <one-to-many class="com.jft.common.StockCategory" /> </set> </class> </hibernate-mapping>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
17
<hibernate-mapping> <class name="com.jft.common.StockCategory" table="stock_category" catalog="jfthibernate"> <id name="stockCategoryId" type="java.lang.Integer"> <column name="STOCK_CATEGORY_ID" /> <generator class="identity" /> </id> <many-to-one name="stock" class="com.jft.common.Stock" > <column name="STOCK_ID" not-null="true" /> </many-to-one> <many-to-one name="category" class="com.jft.common.Category" <column name="CATEGORY_ID" not-null="true" /> </many-to-one> </class> </hibernate-mapping>
>
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
18
Questions and Comments
Copyright 2010 Purple Desk All Rights Reserved. www.javafasttrack.com
19