1. 程式人生 > >hibernate中一對多建表及各種操作

hibernate中一對多建表及各種操作

實體類:

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();