• 利用hibernate实现数据库对象关联(多对一、一对多、一对一、多对多)


    核心思想:

    数据库表对应java类(表-类),表的字段对应类的属性(字段-属性

    关联:把数据库中的外键映射,变成对象的关联关系。

    多对一,一对多,一对一,多对多

    单向,双向

    一、单向,多对一(Info,Nation多个人有同一个民族)
    准备两个基本类和映射文件
    1.给类加关联对象

    import java.util.Date;
    
    public class Info {
        private String code;
        private String name;
        private Boolean sex;
        private Date birthday;
        private Nation nationObj;//给类加关联对象。添加一个成员nationObj,并生成getter和setter
    
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Boolean getSex() {
            return sex;
        }
        public void setSex(Boolean sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public Nation getNationObj() {
            return nationObj;
        }
        public void setNationObj(Nation nationObj) {
            this.nationObj = nationObj;
        }    
    }
    public class Nation {
        private String code;
        private String name;
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }    
    }

    2.给hbm.xml文件加关联映射

    给Info.hbm.xml加上<many-to-one>
    <many-to-one name="nationObj" column="nation"></many-to-one>

    <?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="maya.model">
        <class name="Info" table="Info">
            <id name="code" type="java.lang.String">
                <column name="code" />
                <generator class="assigned"></generator>
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" />
            </property>
            <property name="sex" type="java.lang.Boolean">
                <column name="sex" />
            </property>
            <property name="birthday" type="java.util.Date">
                <column name="birthday" />
            </property>
            
            <!--加上<many-to-one> -->
            <!--column:列,class:类名, cascade="save-update",加这个配置属性目的是,many表和one表一起更新 -->
            <many-to-one name="nationObj" column="nation" class="Nation" cascade="save-update">
            </many-to-one>          
        </class>
    </hibernate-mapping>    

    注意:

    1.主要针对的是哪个对象? --- Info
    2.主表是谁?从表是谁?主表是约束别人的,从表是被约束的。 外键在从表上。
    主表是nation,从表是info
    3.在实体类中,外键属性与关联对象,留一个就可以。在hbm.xml文件中,外键属性与<many-to-one>也留一个就可以。
    如果两个都保留,记得在<many-to-one>上加上两个属性insert=false,update=false。
    4.一般需要加上cascade="save-update",加这个配置业属性目的是,many表和one表一起更新

    二、单向,一对一(Login和Info)
    准备两个一对一的表和类
    1.给类加关联对象
    给Login加上infoObj属性

    public class Login {
        private int ids;
        private String userName;
        private String password;
        private Info infoObj;
        public int getIds() {
            return ids;
        }
        public void setIds(int ids) {
            this.ids = ids;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public Info getInfoObj() {
            return infoObj;
        }
        public void setInfoObj(Info infoObj) {
            this.infoObj = infoObj;
        }
    }

    2.给Login.hbm.xml加上<many-to-one>配置

    <many-to-one name="infoObj" column="infoCode" unique="true"/>

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
    <hibernate-mapping>
        <class name="maya.model.Login" table="Login"><!-- 上面的hibernate-mapping不带包的路径,class就得带类的路径,下同 -->
            <id name="ids" type="int">
                <column name="ids" />
                <generator class="native"></generator>
            </id>
            <property name="userName" type="java.lang.String">
                <column name="userName" />
            </property>
            <property name="password" type="java.lang.String">
                <column name="password" />
            </property>
            
            <!-- unique的意思是唯一性 -->
            <many-to-one name="infoObj" column="InfoCode" class="maya.model.Info"  unique="true">
                
            </many-to-one>
        </class>
    </hibernate-mapping>


    三、单向,一对多(Info,Work)
    1.给类加关联对象(集合对象)
    private Set<Work> works;

    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Info {
        private String code;
        private String name;
        private Boolean sex;
        private Date birthday;
        private Nation nationObj;
        private Set<Work> works = new HashSet<Work>(0);//给类加关联对象(集合对象)
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Boolean getSex() {
            return sex;
        }
        public void setSex(Boolean sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public Nation getNationObj() {
            return nationObj;
        }
        public void setNationObj(Nation nationObj) {
            this.nationObj = nationObj;
        }
        public Set<Work> getWorks() {
            return works;
        }
        public void setWorks(Set<Work> works) {
            this.works = works;
        }
        
    }
    import java.util.Date;
    
    public class Work {
        private int ids;
        private String infoCode;
        private Date startDate;
        private Date endDate;
        private String firm;
        private String depart;
        private int orders;
        private Info infoObj;//
        public int getIds() {
            return ids;
        }
        public void setIds(int ids) {
            this.ids = ids;
        }
        public String getInfoCode() {
            return infoCode;
        }
        public void setInfoCode(String infoCode) {
            this.infoCode = infoCode;
        }
        public Date getStartDate() {
            return startDate;
        }
        public void setStartDate(Date startDate) {
            this.startDate = startDate;
        }
        public Date getEndDate() {
            return endDate;
        }
        public void setEndDate(Date endDate) {
            this.endDate = endDate;
        }
        public String getFirm() {
            return firm;
        }
        public void setFirm(String firm) {
            this.firm = firm;
        }
        public String getDepart() {
            return depart;
        }
        public void setDepart(String depart) {
            this.depart = depart;
        }
        public int getOrders() {
            return orders;
        }
        public void setOrders(int orders) {
            this.orders = orders;
        }
        public Info getInfoObj() {
            return infoObj;
        }
        public void setInfoObj(Info infoObj) {
            this.infoObj = infoObj;
        }
        
    }

    2.给Info.hbm.xml配置

    <set name="实体类中集合成员的变量名(works)">
    <one-to-many class="Work">
    <key column="infoCode">
    </set>

    <?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="maya.model">
        <class name="Info" table="Info">
            <id name="code" type="java.lang.String">
                <column name="code" />
                <generator class="assigned"></generator>
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" />
            </property>
            <property name="sex" type="java.lang.Boolean">
                <column name="sex" />
            </property>
            <property name="birthday" type="java.util.Date">
                <column name="birthday" />
            </property>
            
                      
             <set name="works" table="Work" cascade="save-update" ><!-- name="实体类中集合成员的变量名(works)"-->
                <key>
                    <column name="infoCode" />
                </key>
                <one-to-many class="Work" />
            </set>
        </class>
    </hibernate-mapping>

    四、多对多(Student和Course,中间表Score)
    数据库中没有多对多的关系。只有程序里面有。数据库中是使用两个一对多和多对一来实现多对多的。典型的是:中间表
    在程序中,如果中间表中没有其它信息,那就可以不用写中间表的实体类。
    多对多,还可以用在:用户和角色的关系上。
    1.给类加关联对象(集合对象)

    import java.util.Date;
    import java.util.Set;
    
    public class Student {
        private String sno;
        private String sname;
        private String ssex;
        private Date sbirthday;
        private String sclass;
        private Set<Course> courses;
        public String getSno() {
            return sno;
        }
        public void setSno(String sno) {
            this.sno = sno;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public String getSsex() {
            return ssex;
        }
        public void setSsex(String ssex) {
            this.ssex = ssex;
        }
        public Date getSbirthday() {
            return sbirthday;
        }
        public void setSbirthday(Date sbirthday) {
            this.sbirthday = sbirthday;
        }
        public String getSclass() {
            return sclass;
        }
        public void setSclass(String sclass) {
            this.sclass = sclass;
        }
        public Set<Course> getCourses() {
            return courses;
        }
        public void setCourses(Set<Course> courses) {
            this.courses = courses;
        }
        
    }
    import java.util.Set;
    
    public class Course {
        private String cno;
        private String cname;
        private String tno;
        private Set<Student> students;
        public String getCno() {
            return cno;
        }
        public void setCno(String cno) {
            this.cno = cno;
        }
        public String getCname() {
            return cname;
        }
        public void setCname(String cname) {
            this.cname = cname;
        }
        public String getTno() {
            return tno;
        }
        public void setTno(String tno) {
            this.tno = tno;
        }
        public Set<Student> getStudents() {
            return students;
        }
        public void setStudents(Set<Student> students) {
            this.students = students;
        }
        
    }

    2.给hbm.xml配置

    <set name="当前类的集合属性" table="中间表">
    <key column="中间表中与此表对应的外键"></key>
    <many-to-many class="另外多方对象的类名" column="另外多方对象在中间表中的外键"></many-to-many>
    </set>

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
    <hibernate-mapping package="maya.model">
        <class name="Course" table="Course">
            <id name="cno" type="java.lang.String">
                <generator class="assigned"></generator>
            </id>
            <property name="cname"/>
            <property name="tno" />
              
              <set name="students" table="score">
                  <key column="cno"></key>
                  <many-to-many class="Student" column="sno"></many-to-many>
              </set>
        </class>
    </hibernate-mapping>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
    <hibernate-mapping package="com.itnba.maya.model">
        <class name="Student" table="Student">
            <id name="sno" type="java.lang.String">
                <generator class="assigned"></generator>
            </id>
            <property name="sname"/>
            <property name="ssex" />
              <property name="sbirthday" />
              <property name="sclass" column="class" />
              <set name="courses" table="score">
                  <key column="sno"></key>
                  <many-to-many class="Course" column="cno"></many-to-many>
              </set>
        </class>
    </hibernate-mapping>
  • 相关阅读:
    duilib布局
    C++中嵌入网页(duilib编辑框的实现)
    拖拽的实现
    调试URL(写文件)
    如何使用DataBinder.Eval()方法进行数据绑定
    GridVew,DataList,Repeater分页用户控件(第一版)
    关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(转)
    使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
    一个取得数据控件模板中输入框值的类
    在GridView中自定按钮,实现删除和更新
  • 原文地址:https://www.cnblogs.com/jonsnow/p/6504708.html
Copyright © 2020-2023  润新知