hibernate 映射关系 一对多(多对一)

一:一对多(多对一)关系

概念:一对多关系是关系型数据库中两个表之间的一种关系。通常在数据库层级中,两表之间是有主外键关系的。在ORM中,如何通过对象描述表之间的关系,是ORM核心。

2.Hibernate的一对多关联映射【重点】

eg:国家->省份->城市 (表设计)

Nation.hbm.xml

 <class name="com.zking.entity.Nation" table="NATION">
        <id name="nid" type="java.lang.String">
            <column name="NID" />
            <generator class="guid" />
        </id>
        <property name="nname" type="java.lang.String">
            <column name="NNAME" />
        </property>
        <set name="provinceList" table="PROVINCE" inverse="true" lazy="false" cascade="all-delete-orphan">
            <key>
                <column name="NID" />
            </key>
            <one-to-many class="com.zking.entity.Province" />
        </set>
    </class>

Province.hbm.xml

  <class name="com.zking.entity.Province" table="PROVINCE">
        <id name="pid" type="java.lang.String">
            <column name="PID" />
            <generator class="guid" />
        </id>
        <property name="pname" type="java.lang.String">
            <column name="PNAME" />
        </property>
        <many-to-one name="nation" class="com.zking.entity.Nation" fetch="join">
            <column name="NID" />
        </many-to-one>
        <!-- 
                使用set来描述在一的一方中关联的多,也即Set<class>
               它的name属性就是Set集合的名称:cityList
            key:它主要描述关联的多的一方产生的外键名称,注意要与多的一方定义的外键名称相同
            one-to-many:主要描述集合中的类型
        -->
        <set name="cityList" table="CITY" inverse="true" lazy="false" cascade="all-delete-orphan">
            <key>
                <column name="PID" />
            </key>
            <one-to-many class="com.zking.entity.City" />
        </set>
    </class>

City.hbm.xml

 <class name="com.zking.entity.City" table="CITY">
        <id name="cid" type="java.lang.String">
            <column name="CID" />
            <generator class="guid" />
        </id>
        <property name="cname" type="java.lang.String">
            <column name="CNAME" />
        </property>
        <many-to-one name="province" class="com.zking.entity.Province" fetch="join" >
            <column name="PID" />
        </many-to-one>
    </class>

这样映射文件里面就建立好主外键关系了

现在在test里面测试一下增加

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.zking.entity.City;
import com.zking.entity.Nation;
import com.zking.entity.Province; 

 public class TestMany {
	
	private Configuration con=null;
	private SessionFactory sf=null;
	private Session session=null;
	private Transaction transaction=null;
	
	
	
	@Before
	public void before() {
		con=new Configuration().configure();
		sf=con.buildSessionFactory();
		session=sf.openSession();
		transaction=session.beginTransaction();
		 
	}
	
	@After
	public void after() {
		transaction.commit();
		session.close();
		sf.close();
		 
	}
	
	/**
	 * 增加
	 */
	@Test
	public void add() {
		Nation n=new Nation();
		//国家
		n.setNname("中国");
		//省份
		Province p=new Province();
		p.setPname("湖南");
		Province p1=new Province();
		p1.setPname("广东");
		//城市
		City c1=new City();
		c1.setCname("长沙");
		City c2=new City();
		c2.setCname("株洲");
		City c3=new City();
		c3.setCname("湘潭");
		City c4=new City();
		c4.setCname("郴州");
		City c5=new City();
		c5.setCname("广州");
		City c6=new City();
		c6.setCname("深圳");
		City c7=new City();
		c7.setCname("佛山");
		
		//互设
		//国家里加省份
		n.getProvinceList().add(p);
		n.getProvinceList().add(p1);
		//省份对应国家
		p.setNation(n);
		p1.setNation(n);
		//省份里加城市
		p.getCityList().add(c1);
		p.getCityList().add(c2);
		p.getCityList().add(c3);
		p.getCityList().add(c4);
		p1.getCityList().add(c5);
		p1.getCityList().add(c6);
		p1.getCityList().add(c7);
		//城市对应省份
		c1.setProvince(p);
		c2.setProvince(p);
		c3.setProvince(p);
		c4.setProvince(p);
		c5.setProvince(p1);
		c6.setProvince(p1);
		c7.setProvince(p1);
		//保存
		session.save(n);
		 
		
	}
		 
		
	}

每一个都要增加进去 因为是互设关系(双向关系)

这样就增加好了

查询输出全部增加的信息

查询是根据主外键关系查询的 而删除是根据级联删除的 要搞清楚 查询没有级联关系.

 如果不太清楚实现过程 可以show-sql 显示sql语句 看看 如何实现

hibernate.cfg.xml中加一条配置信息

<property name="show_sql">true</property>

级联关系不懂的话可以参考下我前一篇博客,希望对你们有用! 

猜你喜欢

转载自blog.csdn.net/qqqnzhky/article/details/82594283
今日推荐