Hibernate之one-to-many 感悟:基于架构的设计,主要在于xml配置文件的编写 原理:表中一对多的实现是在表中使用外键关联,也就是通过一张表的主键做为另一个表的外键来建立一对多关系。 在hibernate的pojo类中实现一对多关系的方法是在主控类中个设置一个集合属性来包含对方类的若干对象,而在另一个类中,只包含主控类的一个对象,从而实现一对多关系的建立。 例如:customer和order表,一个customer对应多个order(订单),则应该在Customer的pojo类中设置一个set来包含order的若干对象。 demo: 1、数据库: create table `testdb`.`customer`( `cid` int not null auto_increment, `cname` varchar(20), primary key (`cid`) ); create unique index `PRIMARY` on `testdb`.`customer`(`cid`); create table `testdb`.`order`( `oid` int not null auto_increment, `odes` varchar(500), `cid` int, primary key (`oid`) ); create unique index `PRIMARY` on `testdb`.`order`(`oid`); 注意,上面两个表在数据库中是相互独立的噢,由于这里所说的一对多是在hibernate层上讨论的,跟在数据库中创建主外键的关联不一样。 2、创建eclipse的hibernate支持 3、创建两个表的hbm映射,并相应生成POJO类 4、修改pojo类 遵从刚才讨论的在hibernate层上实现一对多的原则:在主控类中个设置一个集合属性来包含对方类的若干对象,而在另一个类中,只包含主控类的一个对象,从而实现一对多关系的建立。 //Customer.java package org.myhibernate; import java.util.HashSet; import java.util.Set; /** * Customer generated by MyEclipse Persistence Tools */ public class Customer implements java.io.Serializable { // Fields private Integer cid; private String cname; private Set orders=new HashSet(); public Set getOrders() { return orders; } public void setOrders(Set orders) { this.orders = orders; } /** default constructor */ public Customer() { } /** full constructor */ public Customer(String cname) { this.cname = cname; } // Property accessors public Integer getCid() { return this.cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCname() { return this.cname; } public void setCname(String cname) { this.cname = cname; } } //Order.java package org.myhibernate; /** * Order generated by MyEclipse Persistence Tools */ public class Order implements java.io.Serializable { // Fields private Integer oid; private String odes; private Customer customer;//注意:这里没有跟数据库相应的cid属性,取而代之的是一个主表的类对象customer // Constructors /** default constructor */ public Order() { } /** full constructor */ public Order(String odes, Integer cid) { this.odes = odes; } // Property accessors public Integer getOid() { return this.oid; } public void setOid(Integer oid) { this.oid = oid; } public String getOdes() { return this.odes; } public void setOdes(String odes) { this.odes = odes; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } } 5、修改hbm映射 <!--Customer.hbm.xml--> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="org.myhibernate.Customer" table="customer" catalog="testdb"> <id name="cid" type="integer"> <column name="cid" /> <generator class="native" /> </id> <property name="cname" type="string"> <column name="cname" length="20" /> </property> <set name="orders" table="order" cascade="all"> <key column="cid"></key> <one-to-many class="org.myhibernate.Order" /> </set> </class> </hibernate-mapping> <!--Order.hbm.xml--> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="org.myhibernate.Order" table="order" catalog="testdb"> <id name="oid" type="integer"> <column name="oid" /> <generator class="native" /> </id> <property name="odes" type="string"> <column name="odes" length="500" /> </property> <many-to-one name="customer" class="org.myhibernate.Customer" column="cid" > </many-to-one> |
Hibernate之one-to-many
最新推荐文章于 2018-10-28 22:12:00 发布