一:一对多(多对一)关系
概念:一对多关系是关系型数据库中两个表之间的一种关系。通常在数据库层级中,两表之间是有主外键关系的。在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>
级联关系不懂的话可以参考下我前一篇博客,希望对你们有用!