• Hibernate_组件映射


    Hibernate中如果表中信息太多,可以讲表中信息分成多个部分也射到类中,这就是组件。

    比如学生有身体状况和学习成绩两部分信息,下面例子是组件的使用方法:

    Info.java:

    /**
     * 学生身体状况信息
     * 
     * @author Caihanyuan
     * @time 2012-8-24 上午10:43:07
     */
    public class Info {
        private double height;
        private double weight;
    
        public Info() {
    
        }
    
        public Info(double height, double weight) {
            this.height = height;
            this.weight = weight;
        }
     
            //getter和setter方法
    }

    Report.java:

    /**
     * 学生成绩信息
     * 
     * @author Caihanyuan
     * @time 2012-8-24 上午10:44:01
     */
    public class Report {
        private int math;
        private int chinese;
        private int english;
    
        public Report() {
    
        }
    
        public Report(int math, int chinese, int english) {
            super();
            this.math = math;
            this.chinese = chinese;
            this.english = english;
        }
    
           //省略getter,setter
    }

    Student.java:

    /**
     * 学生实体类,对应于表格student
     * 
     * @author Caihanyuan
     * @time 2012-8-24 上午10:42:53
     */
    public class Student {
        private String id;
        private String name;
        private Info info;
        private Report report;
    
        public Student() {
    
        }
    
        public Student(String id, String name, Info info, Report report) {
            this.id = id;
            this.name = name;
            this.info = info;
            this.report = report;
        }
    
        //getter,setter
    }

    对应的配置文件:

    Student.hbm.xml:

    <hibernate-mapping>
        <class name="com.sunflower.pojo.Student" table="student">
            <id name="id" column="id" type="string">
                <generator class="uuid"></generator>
            </id>
    
            <property name="name" column="name" type="string"></property>
    
            <!-- 身体状况组件信息Info -->
            <component name="info" class="com.sunflower.pojo.Info">
                <property name="height" type="double"></property>
                <property name="weight" type="double"></property>
            </component>
    
            <!-- 成绩组件信息Report -->
            <component name="report" class="com.sunflower.pojo.Report">
                <property name="math" type="int"></property>
                <property name="chinese" type="int"></property>
                <property name="english" type="int"></property>
            </component>
        </class>
    </hibernate-mapping>

    反向生成表格:

    drop table if exists student
    create table student (id varchar(255) not null, name varchar(255), height double
    precision, weight double precision, math integer, chinese integer, english integer,
    primary key (id))

    测试:
    Test.java:

    public class Test {
        public void save() {
            Session session = HibernateUtil.getSession();
            Transaction ts = session.beginTransaction();
    
            try {
                Info info = new Info();
                info.setHeight(1.75);
                info.setWeight(65);
    
                Report report = new Report();
                report.setMath(85);
                report.setChinese(90);
                report.setEnglish(95);
    
                Student studnet = new Student();
                studnet.setName("柳长风");
                studnet.setInfo(info);
                studnet.setReport(report);
    
                session.save(studnet);
                ts.commit();
            }
            catch (Exception e) {
                e.printStackTrace();
                ts.rollback();
            }
            finally {
                HibernateUtil.closeSession(session);
            }
        }
    
        @SuppressWarnings("unchecked")
        public void get() {
    
            Session session = HibernateUtil.getSession();
            Transaction ts = session.beginTransaction();
    
            try {
                List list = session.createQuery("from Student").list();
                Student student = (Student) list.get(0);
    
                System.out.println("name is:" + student.getName() + " height is:"
                        + student.getInfo().getHeight() + " weight is:"
                        + student.getInfo().getWeight());
                ts.commit();
            }
            catch (Exception e) {
                e.printStackTrace();
                ts.rollback();
            }
            finally {
                HibernateUtil.closeSession(session);
            }
        }
    
        public static void main(String[] args) {
            Test test = new Test();
            test.save();
            test.get();
        }
    }

    测试结果:

    插入:

    insert into student (name, height, weight, math, chinese, english, id) values
    (?, ?, ?, ?, ?, ?, ?)

    查询:

    select student0_.id as id0_, student0_.name as name0_, student0_.height as
    height0_, student0_.weight as weight0_, student0_.math as math0_, student0_.chinese as
    chinese0_, student0_.english as english0_ from student student0_
    name is:柳长风  height is:1.75  weight is:65.0

     

    如果对组件进行双向映射,需要修改组件类和映射文件:

    修改Info.java:

    public class Info {
        private double height;
        private double weight;
        private Student student;    
    
        public Info() {
    
        }
    
        public Info(double height, double weight) {
            this.height = height;
            this.weight = weight;
        }
     
            //getter和setter方法
    }

    Student.hbm.xml:

    1    <!-- 身体状况组件信息Info -->
    2         <component name="info" class="com.sunflower.pojo.Info">
    3             <parent name="student"/>
    4             <property name="height" type="double"></property>
    5             <property name="weight" type="double"></property>
    6         </component>

    在第3行中的中加入<parent/>标签就可以对组件进行反向求得整体. 

     

     

    一颗平常心,踏踏实实,平静对待一切
  • 相关阅读:
    java框架篇---Struts入门
    AJAX开发技术
    程序开发:MVC设计模式与应用
    java基础篇---JSP内置对象详解
    java基础篇---文件上传(commons-FileUpload组件)
    java基础篇---文件上传(smartupload组件)
    java基础篇---枚举详解
    java基础篇---异常处理
    Java基础篇--字符串处理(StringBuffer)
    java基础篇---正则表达式
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2653934.html
Copyright © 2020-2023  润新知