Java Fast Track: Hibernate - Association Mapping
Java Fast Track: Hibernate - Association Mapping
Copyright 2010 Purple Desk All Rights Reserved. PurpleDesk.and its logo are Trademarks of Purple Desk.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>
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>
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>
13
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`);
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>
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>
>
18
19