• 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());
            }
            
        }
    }
  • 相关阅读:
    typora的使用
    kibana解决Kibana server is not ready yet问题
    docker详细
    docker 启动报错:Docker.Core.Backend.BackendException: Error response from daemon: open \.pipedocker_e
    win10的docker配置nginx
    lombok常用注解
    关于前端项目cookie的获取
    使用apt安装docker
    linux下root用户和普通用户切换
    deepin系统安装与linux磁盘分区
  • 原文地址:https://www.cnblogs.com/chai-blogs/p/12933845.html
Copyright © 2020-2023  润新知