最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的Hibernate框架中一對(duì)多的單向和雙向關(guān)聯(lián)映射

 更新時(shí)間:2016年06月23日 08:59:11   作者:zhang_xinxiu  
建立對(duì)SQL語句的映射是Hibernate框架操作數(shù)據(jù)庫的主要手段,這里我們列舉實(shí)例來為大家講解Java的Hibernate框架中一對(duì)多的單向和雙向關(guān)聯(lián)映射

一、一對(duì)多單向關(guān)聯(lián)映射

一對(duì)多關(guān)系的對(duì)象模型在日常生活中也經(jīng)??吹?,就拿學(xué)生和班級(jí)來說,一個(gè)班級(jí)里有多個(gè)學(xué)生,所以班級(jí)和學(xué)生的關(guān)系是一對(duì)多的關(guān)系,映射到對(duì)象模型中,如下圖:

201662390330145.png (450×131)

對(duì)象模型說明了這種一對(duì)多的關(guān)系是由一的一端來維護(hù)的,那么映射成關(guān)系模型就是一個(gè)班級(jí)字段下面會(huì)有多個(gè)學(xué)生,這樣就形成了一對(duì)多的關(guān)系,通過班級(jí)能夠查詢獲得學(xué)生信息,對(duì)應(yīng)的關(guān)系模型如下圖:

201662390408017.png (594×204)

1、基本配置

有了對(duì)象模型接下來就讓它們映射為對(duì)應(yīng)的關(guān)系代碼,在進(jìn)行關(guān)系映射時(shí)需要在一的一端添加<one-to-many>標(biāo)簽,另外還需要在一的一端添加Set屬性,它支持延遲加載,然后在映射文件添加set標(biāo)簽,并指明一對(duì)多的關(guān)系,這樣就能夠在一的一端查詢獲取多的一端。

Classes類及映射文件:
它是模型中最重要的一端,在該端需要添加對(duì)應(yīng)的set屬性,并在配置文件中添加set標(biāo)簽,在set標(biāo)簽中配置相應(yīng)的<one-to-many>對(duì)象,具體Classes.java對(duì)象代碼如下:

package com.src.hibernate; 
 
import java.util.Set; 
 
public class Classes { 
  private int id; 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  private String name; 
   
  //Set支持延遲加載 
  private Set students; 
  public Set getStudents() { 
    return students; 
  } 
  public void setStudents(Set students) { 
    this.students = students; 
  } 
} 

Classes對(duì)象中使用了set屬性,但是只是說明了延遲加載的屬性,并沒有為屬性配置對(duì)應(yīng)的對(duì)象,屬性的對(duì)象是要在映射文件中來配置的,需要添加set標(biāo)簽,并在set標(biāo)簽中添加<one-to-many>標(biāo)簽,具體如下代碼:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
  <class name="com.hibernate.Classes" table="t_classes"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="students"> 
      <key column="classesid"></key> 
      <one-to-many class="com.hibernate.Student"></one-to-many> 
    </set> 
  </class> 
</hibernate-mapping> 

對(duì)應(yīng)的Student對(duì)象中的代碼和映射文件不需要什么特殊的配置,只需要按照通常的寫法編寫即可,具體的配置方法不再詳述,很簡(jiǎn)單。配置好后需要生成對(duì)應(yīng)的SQL語句,將對(duì)象模型轉(zhuǎn)化為關(guān)系模型時(shí)Hibernate生成相應(yīng)的語句如下:

alter table t_student drop foreign key FK4B9075705E0AFEFE 
drop table if exists t_classes 
drop table if exists t_student 
create table t_classes (id integer not null auto_increment, name varchar(255), primary key (id)) 
create table t_student (id integer not null auto_increment, name varchar(255), classesid integer, primary key (id)) 
alter table t_student add index FK4B9075705E0AFEFE (classesid), add constraint FK4B9075705E0AFEFE foreign key (classesid) references t_classes (id) 

生成的對(duì)應(yīng)的關(guān)系模型如下圖:

201662390506200.png (592×298)

對(duì)比SQL語句和關(guān)系模型,相應(yīng)的表之間的關(guān)聯(lián)是通過外鍵來維護(hù)的,首先是創(chuàng)建兩張表,并指定表的主鍵,最后添加一對(duì)多的外鍵關(guān)聯(lián)關(guān)系。

2、基本操作
在對(duì)數(shù)據(jù)庫的操作無非是讀和寫兩種,修改也屬于寫的一種,接下來看看是如何向數(shù)據(jù)庫中寫入和讀取操作的。

(1)寫入數(shù)據(jù):
寫入數(shù)據(jù)需要注意的是一對(duì)多的關(guān)系,所以在添加的時(shí)候需要添加多個(gè)學(xué)生類,另外由于在classes中添加了對(duì)應(yīng)的set屬性,所以在添加Student對(duì)象時(shí)應(yīng)該使用HashSet來添加,這樣既可實(shí)現(xiàn)一對(duì)多的關(guān)系,具體如下代碼:

public void testSave2(){ 
  Session session=null; 
  try{ 
    session=HibernateUtils.getSession(); 
    session.beginTransaction(); 
     
    Student student1=new Student(); 
    student1.setName("zhangsan"); 
    session.save(student1); 
     
    Student student2=new Student(); 
    student2.setName("lisi"); 
    session.save(student2); 
     
    Classes classes=new Classes(); 
    classes.setName("ClassOne"); 
     
    Set students=new HashSet(); 
    students.add(student1); 
    students.add(student2); 
     
    classes.setStudents(students); 
    //可以成功保存數(shù)據(jù) 
    //但是會(huì)發(fā)出多余的update語句來維持關(guān)系,因?yàn)槭且粚?duì)多的原因 
    session.save(classes); 
    session.getTransaction().commit(); 
  }catch(Exception e){ 
    e.printStackTrace(); 
    session.getTransaction().rollback(); 
  }finally{ 
    HibernateUtils.closeSession(session); 
  } 
} 

那么運(yùn)行上面的測(cè)試用例生成的對(duì)應(yīng)的數(shù)據(jù)寫入到數(shù)據(jù)庫中后如下圖:

201662390557907.png (677×392)

(2)讀取數(shù)據(jù):
寫入操作相對(duì)簡(jiǎn)單,只需要把所有加載的對(duì)象都添加到Transient狀態(tài)下,運(yùn)行相應(yīng)的方法就可以插入內(nèi)容,但是對(duì)應(yīng)的讀取操作就會(huì)稍微復(fù)雜點(diǎn),因?yàn)樾枰@取所有的學(xué)生對(duì)象,所以這種一對(duì)多的關(guān)系效率并不很高,具體代碼如下:

package com.test.hibernate; 
 
import java.util.Iterator; 
import java.util.Set; 
import com.src.hibernate.*; 
import junit.framework.TestCase; 
import org.hibernate.Session; 
 
public class One2ManyTest extends TestCase { 
  public void testLoad1(){ 
    Session session=null; 
    try{ 
      session=HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      //獲取主鍵為5的班級(jí)信息 
      Classes classes=(Classes)session.load(Classes.class,5); 
      //打印班級(jí)信息 
      System.out.println("classes.name="+classes.getName()); 
      //設(shè)置學(xué)生集合,通過班級(jí)加載學(xué)生集合 
      Set students=classes.getStudents(); 
      //迭代集合,打印集合中學(xué)生的信息 
      for(Iterator iter=students.iterator();iter.hasNext();){ 
        Student student=(Student)iter.next(); 
         
        System.out.println("student.name="+student.getName()); 
      } 
       
      session.getTransaction().commit(); 
    }catch(Exception e){ 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally{ 
      HibernateUtils.closeSession(session); 
    } 
  } 
} 

生成的相應(yīng)的語句及信息如下語句:

Hibernate: select classes0_.id as id1_0_, classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id=? 
classes.name=ClassOne 
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id0_0_, students0_.name as name0_0_ from t_student students0_ where students0_.classesid=? 
student.name=lisi 
student.name=zhangsan 

二、一對(duì)多雙向關(guān)聯(lián)映射
這里繼續(xù)采用學(xué)生和班級(jí)作為示例,班級(jí)和學(xué)生之間是一對(duì)多的關(guān)系,一個(gè)班級(jí)中擁有多名學(xué)生,和上篇文章不同的是這里的關(guān)系是雙向的,也就是一的一端和多的一端同時(shí)維護(hù)關(guān)聯(lián)關(guān)系,所以它的對(duì)象圖如下:

201662390642632.png (450×131)

對(duì)應(yīng)的關(guān)系模型圖沒有太大的變化,因?yàn)樗鼈冎g的關(guān)系是雙向的,所以在關(guān)系模型中兩端同時(shí)維護(hù)關(guān)聯(lián)關(guān)系,映射到關(guān)系模型中如下圖所示:

201662390706339.png (649×213)

在一對(duì)多的單向關(guān)聯(lián)中映射文件只需要在一的一端進(jìn)行特殊配置就可以,使用<one-to-many>配置,并在對(duì)象模型中使用set迭代器來設(shè)置外聯(lián)的對(duì)象模型,但是不同的是在雙向的關(guān)聯(lián)中需要在多的一端添加對(duì)應(yīng)的另一端的外鍵關(guān)聯(lián),這時(shí)候就必須在多的一端使用<many-to-one>的關(guān)聯(lián)關(guān)系來標(biāo)明這種雙向性。

1、映射

這里還使用Classes和Student來做示例,在Classes一端的內(nèi)容和上文相同不會(huì)發(fā)生變換,但是多的一端Student的配置會(huì)發(fā)生變化,也就是在映射文件中需要添加<many-to-one>標(biāo)簽。
Student.hbm.xml映射文件配置需要添加外鍵列<many-to-one>標(biāo)簽,并且該列的名稱要和Classes.hbm.xml的外鍵列的名稱一致,具體如下代碼:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
  <class name="com.src.hibernate.Student" table="t_student"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <!-- 在多的一端Student中添加一行新的Classes列 ,并且列的名稱要和Classes.hbm.xml的列明相同--> 
    <many-to-one name="classes" column="classesid"></many-to-one> 
  </class> 
</hibernate-mapping> 

Classes.hbm.xml映射文件的配置和上篇文章相同,需要注意的是在Classes.java文件中添加了set屬性映射對(duì)應(yīng)了Student對(duì)象,所以在映射文件中需要添加set標(biāo)簽來指示為對(duì)象模型中使用了set迭代器,具體配置如下代碼:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
  <class name="com.src.hibernate.Classes" table="t_classes"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="students" inverse="true"> 
      <key column="classesid"></key> 
      <one-to-many class="com.src.hibernate.Student"></one-to-many> 
    </set> 
  </class> 
</hibernate-mapping> 

2、類

映射文件的配置是直接對(duì)應(yīng)著類來的,所以有了映射文件就能夠?qū)懗鱿鄳?yīng)的類,相同的有了類就能夠知道對(duì)應(yīng)的映射文件如何編寫,那來看看相應(yīng)的類代碼如何編寫。
Student.java類,需要在類中添加關(guān)聯(lián)的班級(jí)對(duì)象屬性,在加載Student時(shí)能獲得Classes的相關(guān)信息。

package com.src.hibernate; 
 
public class Student { 
   
  //關(guān)聯(lián)的班級(jí)對(duì)象 
  private Classes classes; 
  public Classes getClasses() { 
    return classes; 
  } 
  public void setClasses(Classes classes) { 
    this.classes = classes; 
  } 
   
  //學(xué)生id 
  private int id; 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
   
  //學(xué)生姓名 
  private String name; 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
   
} 

Classes.java文件具體代碼內(nèi)容見上篇文章,這里就不在詳述。
有了對(duì)象模型接下來生成關(guān)系模型,生成的SQL語句如下:

alter table t_student drop foreign key FK4B907570FC588BF4 
drop table if exists t_classes 
drop table if exists t_student 
create table t_classes (id integer not null auto_increment, name varchar(255), primary key (id)) 
create table t_student (id integer not null auto_increment, name varchar(255), classesid integer, primary key (id)) 
alter table t_student add index FK4B907570FC588BF4 (classesid), add constraint FK4B907570FC588BF4 foreign key (classesid) references t_classes (id) 

3、數(shù)據(jù)操作

建立表結(jié)構(gòu)后來編寫測(cè)試方法來驗(yàn)證數(shù)據(jù)的操作,首先來看看數(shù)據(jù)的插入,向表結(jié)構(gòu)中插入數(shù)據(jù),寫入數(shù)據(jù)時(shí)會(huì)有兩種情況,一種是首先創(chuàng)建一個(gè)Classes對(duì)象,并將對(duì)象寫入到數(shù)據(jù)庫中,然后創(chuàng)建Student對(duì)象,在Classes對(duì)象中添加學(xué)生對(duì)象;另外一種是先創(chuàng)建學(xué)生對(duì)象,并將學(xué)生對(duì)象寫入數(shù)據(jù)庫中,然后創(chuàng)建Classes對(duì)象將學(xué)生對(duì)象加入到Classes對(duì)象中,這兩種類型的操作最后是不相同的,來對(duì)比下。

3.1 先寫班級(jí)后寫學(xué)生
先把班級(jí)寫入到數(shù)據(jù)庫中后,Classes對(duì)象進(jìn)入了Transient狀態(tài),并在數(shù)據(jù)庫中有了一行,這時(shí)再寫Student對(duì)象,Student對(duì)象會(huì)查找對(duì)應(yīng)的Classes的主鍵將其寫入到表中,所以此時(shí)關(guān)系模型中的數(shù)據(jù)都是非空的,保存的代碼如下:

public void testSave(){ 
  Session session=null; 
  try{ 
    //創(chuàng)建session對(duì)象 
    session=HibernateUtils.getSession(); 
    //開啟事務(wù) 
    session.beginTransaction(); 
    //創(chuàng)建班級(jí)對(duì)象,將班級(jí)對(duì)象寫入到數(shù)據(jù)庫中 
    Classes classes=new Classes(); 
    classes.setName("class"); 
    session.save(classes); 
    //創(chuàng)建學(xué)生1對(duì)象,將學(xué)生對(duì)象寫入到數(shù)據(jù)庫中 
    Student student1=new Student(); 
    student1.setName("zhangsan"); 
    student1.setClasses(classes); 
    session.save(student1); 
    //創(chuàng)建學(xué)生2對(duì)象,將學(xué)生對(duì)象寫入到數(shù)據(jù)庫中 
    Student student2=new Student(); 
    student2.setName("lisi"); 
    student2.setClasses(classes); 
    session.save(student2); 
     
    session.getTransaction().commit(); 
  }catch(Exception e){ 
    e.printStackTrace(); 
    session.getTransaction().rollback(); 
  }finally{ 
    HibernateUtils.closeSession(session); 
  } 
} 

對(duì)應(yīng)的寫入數(shù)據(jù)庫中的信息列表如下圖:
201662390812018.png (603×268)

3.2 先寫學(xué)生后寫班級(jí)
先把學(xué)生寫入到數(shù)據(jù)庫中此時(shí)因?yàn)閷W(xué)生表需要獲取對(duì)應(yīng)的班級(jí)列的主鍵信息,但是因?yàn)榘嗉?jí)信息轉(zhuǎn)化到Transient狀態(tài),所以在寫入學(xué)生信息時(shí)會(huì)有null值,代碼如下:

寫入后對(duì)應(yīng)的數(shù)據(jù)庫視圖如下:

201662390857957.png (617×308)

 對(duì)比兩種寫入操作,因?yàn)閮蓚€(gè)寫入的先后順序不同所以出現(xiàn)了不同的結(jié)果,但因?yàn)槭请p向的關(guān)聯(lián)關(guān)系所以在寫入時(shí)并不會(huì)發(fā)生異常。
   
4、讀取操作

相對(duì)于寫入數(shù)據(jù)而言,讀取數(shù)據(jù)就變得很簡(jiǎn)單了,因?yàn)槭请p向的關(guān)聯(lián)所以數(shù)據(jù)的讀取也是雙向的,可以從任何一端讀取另一端的信息,如下代碼:

public void testLoad1(){ 
  Session session=null; 
  try{ 
    session=HibernateUtils.getSession(); 
    session.beginTransaction(); 
     
    //通過班級(jí)讀取學(xué)生信息 
    Classes classes=(Classes)session.load(Classes.class,1); 
    System.out.println("classes.name="+classes.getName()); 
    Set students=classes.getStudents(); 
     
    for(Iterator iter=students.iterator();iter.hasNext();){ 
      Student student=(Student)iter.next(); 
      System.out.println("student.name="+student.getName()); 
    } 
     
    //通過學(xué)生信息讀取班級(jí)信息 
    Student stu=new Student(); 
    stu=(Student)session.load(Student.class, 1); 
    System.out.println("通過學(xué)生加載班級(jí)信息Classes.id= "+stu.getClasses().getId()); 
    session.getTransaction().commit(); 
  }catch(Exception e){ 
    e.printStackTrace(); 
    session.getTransaction().rollback(); 
  }finally{ 
    HibernateUtils.closeSession(session); 
  } 
} 

運(yùn)行上面的測(cè)試語句,生成的對(duì)應(yīng)的語句信息如下:

Hibernate: select classes0_.id as id1_0_, classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id=? 
classes.name=class 
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id0_0_, students0_.name as name0_0_, students0_.classesid as classesid0_0_ from t_student students0_ where students0_.classesid=? 
student.name=lisi 
student.name=zhangsan 

通過學(xué)生加載班級(jí)信息Classes.id= 1 

相關(guān)文章

  • Java獲取XML節(jié)點(diǎn)總結(jié)之讀取XML文檔節(jié)點(diǎn)的方法

    Java獲取XML節(jié)點(diǎn)總結(jié)之讀取XML文檔節(jié)點(diǎn)的方法

    下面小編就為大家?guī)硪黄狫ava獲取XML節(jié)點(diǎn)總結(jié)之讀取XML文檔節(jié)點(diǎn)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • SpringBoot的配置文件(properties與yml)使用方法

    SpringBoot的配置文件(properties與yml)使用方法

    配置文件中的配置類型有兩類,一類是系統(tǒng)配置項(xiàng),這種配置的格式都是固定的,是給系統(tǒng)使用的,另一種是用戶自定義配置,用戶可以隨意地規(guī)定配置項(xiàng)的格式,又用戶自行去設(shè)置和讀取,這篇文章主要介紹了SpringBoot的配置文件(properties與yml)使用方法,需要的朋友可以參考下
    2023-08-08
  • springboot簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    springboot簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    本文主要介紹了springboot簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringSecurity rememberme功能實(shí)現(xiàn)過程解析

    SpringSecurity rememberme功能實(shí)現(xiàn)過程解析

    這篇文章主要介紹了SpringSecurity rememberme功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解

    Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解

    這篇文章主要為大家介紹了Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 基于JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例

    基于JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例

    這篇文章主要介紹了JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java判空的一些常見方法

    Java判空的一些常見方法

    這篇文章主要給大家分享介紹了Java判空的一些常見方法,在程序中必須進(jìn)行嚴(yán)格的判空處理,避免對(duì)空對(duì)象的異常操作,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Spring AOP里的靜態(tài)代理和動(dòng)態(tài)代理用法詳解

    Spring AOP里的靜態(tài)代理和動(dòng)態(tài)代理用法詳解

    這篇文章主要介紹了 Spring AOP里的靜態(tài)代理和動(dòng)態(tài)代理用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解SpringBoot restful api的單元測(cè)試

    詳解SpringBoot restful api的單元測(cè)試

    本篇文章主要介紹了詳解SpringBoot restful api的單元測(cè)試,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Spring boot+mybatis+thymeleaf 實(shí)現(xiàn)登錄注冊(cè)增刪改查功能的示例代碼

    Spring boot+mybatis+thymeleaf 實(shí)現(xiàn)登錄注冊(cè)增刪改查功能的示例代碼

    這篇文章主要介紹了Spring boot+mybatis+thymeleaf 實(shí)現(xiàn)登錄注冊(cè)增刪改查功能的示例代碼,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

兴城市| 大田县| 永济市| 苗栗县| 个旧市| 福泉市| 神农架林区| 滦平县| 新泰市| 榆社县| 房山区| 勃利县| 保亭| 华坪县| 惠东县| 永善县| 铜陵市| 金平| 巢湖市| 正安县| 玛沁县| 北辰区| 沧源| 慈溪市| 湘乡市| 东辽县| 鄂托克旗| 元谋县| 平湖市| 平武县| 修武县| 太和县| 资兴市| 汤阴县| 卓资县| 新源县| 玛纳斯县| 陇西县| 方山县| 临猗县| 罗定市|