hibernate中一對多建表及各種操作
阿新 • • 發佈:2018-11-09
實體類:
Student
private Integer sid; private String sname; private String sage; private String ssex; private Teacher teacher; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSage() { return sage; } public void setSage(String sage) { this.sage = sage; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + ", ssex=" + ssex + "]"; }
注意:因為主鍵sid是native自動增長,所以型別設定成Integer,如果設定成uuid則設定成String
Teacher
private Integer tid; private String tname; private String tage; private String tsex; private Set<Student> students = new HashSet<Student>(); public Integer getTid() { return tid; } public void setTid(Integer tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public String getTage() { return tage; } public void setTage(String tage) { this.tage = tage; } public String getTsex() { return tsex; } public void setTsex(String tsex) { this.tsex = tsex; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } @Override public String toString() { return "Teacher [tid=" + tid + ", tname=" + tname + ", tage=" + tage + ", tsex=" + tsex + "]"; }
注意:Set<Student> students要有初始化,既Set<Student> students = new HashSet<Student>();集合形式也必須時Set
實體類對應的對映檔案
StudentMapper
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="domain.Student" table="t_student"> <id name="sid" column="sid"> <!-- id標籤設定成制動增長 name為實體類中對應的屬性 column為表中的名字 native為自動增長對應Integer,int資料型別,uuid為32隨機字元對應String型別 --> <generator class="native"></generator> </id> <property name="sname" column="sname"></property> <property name="sage" column="sage"></property> <property name="ssex" column="ssex"></property> <!-- column為外來鍵名 --> <many-to-one name="teacher" class="domain.Teacher" column="clid"></many-to-one> </class> </hibernate-mapping>
TeacherMapper
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="domain.Teacher" table="t_teacher">
<id name="tid" column="tid">
<generator class="native"></generator>
</id>
<property name="tname"></property>
<property name="tage"></property>
<property name="tsex"></property>
<!-- inverse是否放棄關係維護,true 是,false 否
cascade="save-update,delete"對主表更新刪除從表自動更新刪除-->
<set name="students" inverse="true" cascade="save-update,delete">
<key column="clid"></key>
<one-to-many class="domain.Student"></one-to-many>
</set>
</class>
</hibernate-mapping>
核心配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- 核心配置檔案格式xml,但是核心配置檔名稱和位置固定的
- 位置:必須src下面
- 名稱:必須hibernate.cfg.xml
-->
<hibernate-configuration>
<session-factory>
<!-- 第一部分: 配置資料庫資訊 必須的 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 第二部分: 配置hibernate資訊 可選的-->
<!-- 輸出底層sql語句 -->
<property name="hibernate.show_sql">true</property>
<!-- 輸出底層sql語句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate幫建立表,需要配置之後
update: 如果已經有表,更新,如果沒有,建立
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置資料庫方言
在mysql裡面實現分頁 關鍵字 limit,只能使用mysql裡面
在oracle資料庫,實現分頁rownum
讓hibernate框架識別不同資料庫的自己特有的語句
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 讓session與本地執行緒繫結在一起 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 第三部分: 把對映檔案放到核心配置檔案中 必須的-->
<mapping resource="domain/TeacherMapper.xml"/>
<mapping resource="domain/StudentMapper.xml"/>
</session-factory>
</hibernate-configuration>
操作
新增
//1.讀取核心配置檔案
Configuration cft = new Configuration();
Configuration configure = cft.configure();
//2.建立sessionFactory回話工廠
SessionFactory sessionFactory = configure.buildSessionFactory();
//3.得到session
Session session = sessionFactory.openSession();
//4.開啟事務
Transaction tx = session.beginTransaction();
//建立老師物件
Teacher teacher = new Teacher();
teacher.setTage("25");
teacher.setTname("老司機");
teacher.setTsex("男");
//建立學生物件
Student student = new Student();
student.setSage("8");
student.setSname("小孩票");
student.setSsex("男");
//設定學生老師
student.setTeacher(teacher);
//設定老師學生
teacher.getStudents().add(student);
// session.save(student);如果設定啦cascade="save-update,delete"則不需執行
session.save(teacher);
tx.commit();
session.close();
sessionFactory.close();
刪除
Teacher teacher = (Teacher) session.get(Teacher.class, 1);
session.delete(teacher);
更改
Student student = (Student) session.get(Student.class, 4);
Teacher teacher = (Teacher) session.get(Teacher.class, 3);
student.setTeacher(teacher);
session.update(student);
查詢3號老師及其學生
Transaction tx = session.beginTransaction();
Teacher teacher = (Teacher) session.get(Teacher.class,3);
Set<Student> students = teacher.getStudents();