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

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


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>

生成的数据库表:



@Test
	public 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>

数据库表:


测试代码:

@Test
	public 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);
		}
	}
	


数据结构:














  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值