一、單向一對多
1、基本配置
- <pre name="code" class="java">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;
- }
- }
<pre name="code" class="java">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對象中使用了set屬性,但是隻是說明了延遲加載的屬性,並沒有爲屬性配置對應的對象,屬性的對象是要在映射文件中來配置的,需要添加set標籤,並在set標籤中添加<one-to-many>標籤,具體如下代碼:- <?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>
<?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>
對應的Student對象中的代碼和映射文件不需要什麼特殊的配置,只需要按照通常的寫法編寫即可,具體的配置方法不再詳述,很簡單。配置好後需要生成對應的SQL語句,將對象模型轉化爲關係模型時Hibernate生成相應的語句如下:
- 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)
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)
生成的對應的關係模型如下圖:
2、基本操作
- 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);
- //可以成功保存數據
- //但是會發出多餘的update語句來維持關係,因爲是一對多的原因
- session.save(classes);
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally{
- HibernateUtils.closeSession(session);
- }
- }
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);
//可以成功保存數據
//但是會發出多餘的update語句來維持關係,因爲是一對多的原因
session.save(classes);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
那麼運行上面的測試用例生成的對應的數據寫入到數據庫中後如下圖:
- 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的班級信息
- Classes classes=(Classes)session.load(Classes.class,5);
- //打印班級信息
- 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());
- }
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally{
- HibernateUtils.closeSession(session);
- }
- }
- }
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的班級信息
Classes classes=(Classes)session.load(Classes.class,5);
//打印班級信息
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());
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
生成的相應的語句及信息如下語句:
- 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
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
結語