zoukankan      html  css  js  c++  java
  • hibernate基础05:关联关系1对多

    1、Java实体bean类

    package com.project.pojo;
    
    import java.io.Serializable;
    
    public class Student implements Serializable{
        private int id;
        private String name;
        private int age;
        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;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
    }
    package com.project.pojo;
    
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Classes implements Serializable{
        private int id;
        private String name;
        private String address;
        private Set<Student> student = new HashSet<Student>();
        
        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;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public Set<Student> getStudent() {
            return student;
        }
        public void setStudent(Set<Student> student) {
            this.student = student;
        }
        
        public void setStudent(Student student) {
            this.getStudent().add(student);
        }
        
        
    }

    2、hbm.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.project.pojo">
        <class name="Classes" table="t_class">
            <id name="id" column="id" type="int">
                <generator class="native"></generator>
            </id>
            <property name="name" />
            <property name="address" />
            <!-- 1对多的关联name为属性名 -->
            <set name="student">
                <!-- column指定外键名 -->
                <key column="class_id"></key>
                <!-- 指定多端的类 -->
                <one-to-many class="Student"/>
            </set>
        </class>
    
    </hibernate-mapping>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- package指定类所在的包,如果不指定,那么在指定class的name时,需要指定完全限定名 -->
    <hibernate-mapping package="com.project.pojo">
        <class name="Student" table="t_student">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name" />
            <property name="age" />
        </class>
    
    </hibernate-mapping>

    3、hibernate.cfg.xml配置

    <?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">
    <hibernate-configuration>
        
        <session-factory>
            <!-- 1、数据库连接信息 -->
            <!-- 指定数据方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://192.168.1.59:3306/hibernate?characterEncoding=UTF8</property>
            <property name="connection.username">root</property>
            <property name="connection.password">1234</property>
            
            <!-- 2、通用配置信息 -->
            <!-- 打印sql语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化sql语句 -->
            <property name="format_sql">true</property>
            
            <!-- 
                hbm2ddl.auto 该属性用于配置是否将映射信息转换为ddl
                create 每次执行都会先删除后再创建表,用于测试
                update 检查数据库表是否存在,如果不存在则先创建表,项目中通常上线使用
             -->
            <!-- <property name="hbm2ddl.auto">update</property> -->
            <!-- 映射文件信息 -->
            <mapping resource="com/project/pojo/Classes.hbm.xml" />
            <mapping resource="com/project/pojo/Student.hbm.xml" />
        </session-factory >
    </hibernate-configuration>

    4、测试

    package com.project.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.project.pojo.Classes;
    import com.project.pojo.Student;
    import com.project.util.HibernateUtil;
    
    public class HibernateTest {
        Session session = null;
        Transaction ts = null;
        
        @Before
        public void setUp(){
            session = HibernateUtil.getSession();
            ts = session.beginTransaction();
        }
        
        @After
        public void tearDown(){
            HibernateUtil.closeSession();
        }
        
        
        @Test
        public void testCreateDB(){
            Configuration cfg = new Configuration().configure();
            //使得hibernate映射信息转换为数据库识别的dll语言
            SchemaExport se = new SchemaExport(cfg);
            //第一个参数:是否打印dll语句
            //第二个参数:是否将dll到数据库中执行
            se.create(true, true);
        }
        
        /**
         * 一对多关联时保存数据会多出n条更新语句,效率比较低
         * 一般不用一对多管理数据
         */
        @Test
        public void testSave(){
            try {
                Classes c1 = new Classes();
                c1.setName("一年级");
                c1.setAddress("B-1栋");
                
                Classes c2 = new Classes();
                c2.setName("二年级");
                c2.setAddress("B-2栋");
                
                Student s1 = new Student();
                s1.setName("张三");
                s1.setAge(20);
                
                Student s2 = new Student();
                s2.setName("李四");
                s2.setAge(21);
                
                Student s3 = new Student();
                s3.setName("哈哈狗");
                s3.setAge(19);
                
                session.save(s1);
                session.save(s2);
                session.save(s3);
                
                //关联关系由1端控制
                c1.setStudent(s1);
                c1.setStudent(s3);
                c2.setStudent(s2);
                
                session.save(c1);
                session.save(c2);
                
                ts.commit();
            } catch (Exception e) {
                e.printStackTrace();
                if(ts!=null) ts.rollback();
            }
        
        }
        
        @Test
        public void testSelect(){
            Classes c = (Classes) session.get(Classes.class, 1);
            System.out.println(c.getName()+"	"+c.getAddress());
            System.out.println("------------------");
            for(Student stu : c.getStudent()){
                System.out.println(stu.getName()+"	"+stu.getAge());
            }
            
        }
    }
  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/chai-blogs/p/12933845.html
Copyright © 2011-2022 走看看