hibernate双向多对一(一对多)及自身一对多关联

来源:互联网 发布:js 发送get请求url 编辑:程序博客网 时间:2024/05/11 20:18

双向多对一(一对多)关联是最最常见的关联关系


javabean如下:

/** *  * 双向的一对多(多对一) * 少的一端,需要对多的一端进行集合的引用 */public class Account {private int id;private String accName;//对多端对象集合的引用private Set<Orders> setOrders;public Account(){}/** * @return the id */public int getId() {return id;}/** * @param id the id to set */public void setId(int id) {this.id = id;}/** * @return the accName */public String getAccName() {return accName;}/** * @param accName the accName to set */public void setAccName(String accName) {this.accName = accName;}/** * @return the setOrders */public Set<Orders> getSetOrders() {return setOrders;}/** * @param setOrders the setOrders to set */public void setSetOrders(Set<Orders> setOrders) {this.setOrders = setOrders;}}


/** *  * 双向的一对多(多对一) * 多的一端需要对少的一端进行对象的引用 */public class Orders {private int id;private String orderNum;private Date orderTime;private Account account;public Orders(){}/** * @return the id */public int getId() {return id;}/** * @param id the id to set */public void setId(int id) {this.id = id;}/** * @return the orderNum */public String getOrderNum() {return orderNum;}/** * @param orderNum the orderNum to set */public void setOrderNum(String orderNum) {this.orderNum = orderNum;}/** * @return the orderTime */public Date getOrderTime() {return orderTime;}/** * @param orderTime the orderTime to set */public void setOrderTime(Date orderTime) {this.orderTime = orderTime;}public Account getAccount() {return account;}public void setAccount(Account account) {this.account = account;}}


映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->    <class name="com.entity.Account" table="acc_tab">    <!-- type指明当前字段的类型    name对应实体中的属性名 -->        <id type="integer" name="id">        <!-- 提供ID自增的策略  native会根据数据库自行判断 -->            <generator class="native"/>        </id>        <property name="accName" type="string"></property>        <set name="setOrders" cascade="all" inverse="true">        <key column="acc_id"></key>        <one-to-many class="com.entity.Orders"/>        </set>                  </class></hibernate-mapping>

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->    <class name="com.entity.Orders" table="order_tab">    <!-- type指明当前字段的类型    name对应实体中的属性名 -->        <id type="integer" name="id">        <!-- 提供ID自增的策略  native会根据数据库自行判断 -->            <generator class="native"/>        </id>        <property name="orderNum" type="string"></property>       <property name="orderTime" type="timestamp"></property>              <many-to-one name="account" column="acc_id"></many-to-one>           </class></hibernate-mapping>

生成的数据库表:



@Testpublic void add(){Transaction tx=null;Session session=null;try{session=HibernateUtils.getSession();tx=session.beginTransaction();Account account=new Account();account.setAccName("lm");Orders order1=new Orders();order1.setOrderNum("100");order1.setOrderTime(new Date());//session.save(order1);Orders order2=new Orders();order2.setOrderNum("10061");order2.setOrderTime(new Date());//session.save(order2);order1.setAccount(account);order2.setAccount(account);Set<Orders> setOrders=new HashSet<Orders>();setOrders.add(order1);setOrders.add(order2);account.setSetOrders(setOrders);session.save(account);tx.commit();}catch(HibernateException he){if(tx!=null){tx.rollback();}he.printStackTrace();}finally{HibernateUtils.closeSession(session);}}

自身关联:


javabean如下:

/** *  * 双向一对多或多对一 自身关联 *  */public class Category {private int id;private String name;//如果把Category看成是多的一端private Category parent;//如果把Category看成是少的一端,则需要对多的一端进行对象集合的引用private Set<Category> clist;public Category(){}/** * @return the id */public int getId() {return id;}/** * @param id the id to set */public void setId(int id) {this.id = id;}/** * @return the name */public String getName() {return name;}/** * @param name the name to set */public void setName(String name) {this.name = name;}/** * @return the parent */public Category getParent() {return parent;}/** * @param parent the parent to set */public void setParent(Category parent) {this.parent = parent;}/** * @return the clist */public Set<Category> getClist() {return clist;}/** * @param clist the clist to set */public void setClist(Set<Category> clist) {this.clist = clist;}}

映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->    <class name="com.entity.Category" table="cate_tab">    <!-- type指明当前字段的类型    name对应实体中的属性名 -->        <id type="integer" name="id">        <!-- 提供ID自增的策略  native会根据数据库自行判断 -->            <generator class="native"/>        </id>        <property name="name" type="string"></property>       <set name="clist" inverse="true">       <key column="parent_id"></key>       <!-- 配置一对多的关联映射 -->       <one-to-many class="com.entity.Category"/>       </set>       <many-to-one name="parent" column="parent_id"></many-to-one>            </class></hibernate-mapping>

数据库表:


测试代码:

@Testpublic void add(){Transaction tx=null;Session session=null;try{session=HibernateUtils.getSession();tx=session.beginTransaction();//添加一级分类Category c1=new Category();c1.setName("computer");session.save(c1);//添加二级分类Category c2=new Category();c2.setName("java");c2.setParent(c1);session.save(c2);//添加二级分类Category c3=new Category();c3.setName(".net");c3.setParent(c1);session.save(c3);tx.commit();}catch(HibernateException he){if(tx!=null){tx.rollback();}he.printStackTrace();}finally{HibernateUtils.closeSession(session);}}


数据结构:














0 0