• Hibernate多对一,多对多的表映射关系


    版权声明:本文为博主原创文章,未经博主允许不得转载。

    package com.huangchao.model;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @author huangchao
     *
     */
    public class User implements Serializable{
        private Integer uid ;
        private String uname ;
        private String password ;
        private String gender ;
        private Integer age ;
        private Date birth ;
        private Contact contact ;
        private Date createtime ;
        private Department dept ;
        
        /**
         * 
         */
        public User() {}
    
        public User(String uname, String password, String gender, Integer age, Date birth, Contact contact, Date createtime,
                Department dept) {
            super();
            this.uname = uname;
            this.password = password;
            this.gender = gender;
            this.age = age;
            this.birth = birth;
            this.contact = contact;
            this.createtime = createtime;
            this.dept = dept;
        }
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        public Contact getContact() {
            return contact;
        }
    
        public void setContact(Contact contact) {
            this.contact = contact;
        }
    
        public Date getCreatetime() {
            return createtime;
        }
    
        public void setCreatetime(Date createtime) {
            this.createtime = createtime;
        }
    
        public Department getDept() {
            return dept;
        }
    
        public void setDept(Department dept) {
            this.dept = dept;
        }
    
        @Override
        public String toString() {
            return "User [uid=" + uid + ", uname=" + uname + ", password=" + password + ", gender=" + gender + ", age="
                    + age + ", birth=" + birth + ", createtime=" + createtime + ", dept=" + dept + "]";
        }
        
    }

     各位小伙伴一定要注意:在书写实体类时,最好让实体类实现Serilizable序列化接口,并且实体类代码一定要符合JavaBean规范

    /**
     * 
     */
    package com.huangchao.model;
    
    /**
     * @author huangchao
     *
     */
    public class Contact {
        private String email ;
        private String province ;
        private String city ;
        private String country ;     //
        private String town ;        //
        private String street ;        //街道
        
        /**
         * 
         */
        public Contact(){}
    
        public Contact(String email, String province, String city, String country, String town, String street) {
            super();
            this.email = email;
            this.province = province;
            this.city = city;
            this.country = country;
            this.town = town;
            this.street = street;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getProvince() {
            return province;
        }
    
        public void setProvince(String province) {
            this.province = province;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getCountry() {
            return country;
        }
    
        public void setCountry(String country) {
            this.country = country;
        }
    
        public String getTown() {
            return town;
        }
    
        public void setTown(String town) {
            this.town = town;
        }
    
        public String getStreet() {
            return street;
        }
    
        public void setStreet(String street) {
            this.street = street;
        }
    
        @Override
        public String toString() {
            return "Contact [email=" + email + ", province=" + province + ", city=" + city + ", country=" + country
                    + ", town=" + town + ", street=" + street + "]";
        }
        
        
    }

     Department.java

    /**
     * 
     */
    package com.huangchao.model;
    
    import java.io.Serializable;
    
    /**
     * @author Huangchao
     *
     */
    public class Department implements Serializable{
        private Integer deptid ;
        private Integer dname ;
        
        
        public Department() {
        }
    
    
        public Department(Integer dname) {
            super();
            this.dname = dname;
        }
    
    
        public Integer getDeptid() {
            return deptid;
        }
    
    
        public void setDeptid(Integer deptid) {
            this.deptid = deptid;
        }
    
    
        public Integer getDname() {
            return dname;
        }
    
    
        public void setDname(Integer dname) {
            this.dname = dname;
        }
        
    }

    写完实体类,现在就要开始.hbm.xml文件的创建了,大家可以手写,也可以使用hibernate tools自动创建,,,,,初学都建议自己动手写,这样也可以加深影响,也可以更好的熟悉有hibernate是如何将实体类自动转化为hbm文件的

    下面是User.hbm.xml的详细代码 :

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2016-8-28 12:23:47 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping>
        <class name="com.huangchao.model.User" table="USER">  //设置数据库表为user
            <id name="uid" type="java.lang.Integer">
                <column name="UID" />
                <generator class="native" />  //主键生成策略,native表示让底层数据库自动选择,mysql默认为主键自增
            </id>

    <!-- 多对一的表关系映射-->
            <many-to-one name="dept" class="com.huangchao.model.Department" >  //对应的关联外键的生成表的类
                <column name="DEPT" />  //对应的外键
            </many-to-one>
            <property name="uname" type="java.lang.String">
                <column name="UNAME" />
            </property>
            <property name="password" type="java.lang.String">
                <column name="PASSWORD" />
            </property>
            <property name="gender" type="java.lang.String">
                <column name="GENDER" />
            </property>
            <property name="age" type="java.lang.Integer">
                <column name="AGE" />
            </property>
            <property name="birth" type="java.util.Date">
                <column name="BIRTH" />
            </property>

      //以组件的形式添加Contact,该Contact通过component表示后不会自动生成数据库中的表,它会以user数据表的字段的形式添加进数据库user表中
            <component name="contact"  class="com.huangchao.model.Contact">
             <property name="province" column="PROVINCE" type="string" />
             <property name="city" column="CITY" type="string" />
             <property name="country" column="COUNTRY" type="string" />
             <property name="town" column="TOWN" type="string" />
             <property name="street" column="STREET" type="string" />
            </component>
     
            <property name="createtime" type="java.util.Date">
                <column name="CREATETIME" />
            </property>
        </class>
    </hibernate-mapping>

    Department.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping>
        <class name="com.huangchao.model.Department" table="DEPARTMENT">
            <id name="deptid" type="java.lang.Integer">
                <column name="DEPTID" />
                <generator class="native" />
            </id>
            <property name="dname" type="java.lang.Integer">
                <column name="DNAME" />
            </property>
        </class>
    </hibernate-mapping>

    至此,重启服务器,sessionFactory会自动为我们创建数据库表.

    多对多关系映射

    Event ---------------------事件 表

    Person--------------------用户 表

    Person_Event_Relation-----------用户事件关系表

    创建实体类

    Event.java

    /**
     * 
     */
    package com.huangchao.model;
    
    import java.io.Serializable;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * @author Administrator
     *
     */
    public class Events implements Serializable {
    
            private Integer eid ;    //Primary key
            private Date date ;
            private String title ;
            
            private Set<Person> person = new HashSet<Person>();
    
            public Integer getEid() {
                return eid;
            }
    
            public void setEid(Integer eid) {
                this.eid = eid;
            }
    
            public Date getDate() {
                return date;
            }
    
            public void setDate(Date date) {
                this.date = date;
            }
    
            public String getTitle() {
                return title;
            }
    
            public void setTitle(String title) {
                this.title = title;
            }
    
            public Set<Person> getPerson() {
                return person;
            }
    
            public void setPerson(Set<Person> person) {
                this.person = person;
            }
            
    }

    Person.java

    /**
     * 
     */
    package com.huangchao.model;
    
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * @author Administrator
     *
     */
    public class Person implements Serializable {
    
        private Integer id; // Primary Key
        private String firstname;
        private String lastname;
    
        private Set<Events> events = new HashSet<Events>();
    
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getFirstname() {
            return firstname;
        }
    
        public void setFirstname(String firstname) {
            this.firstname = firstname;
        }
    
        public String getLastname() {
            return lastname;
        }
    
        public void setLastname(String lastname) {
            this.lastname = lastname;
        }
    
        public Set<Events> getEvents() {
            return events;
        }
    
        public void setEvents(Set<Events> events) {
            this.events = events;
        }
    
    }

    添加实体类所对应的hbm.xml文件

    Event.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping >
      <class name="com.huangchao.model.Events" table="EVENT">
          <id name="eid" column="EVENT_ID" type="int">
              <generator class="native" />
          </id>
          <property name="title" column="TITLE" type="string" />
          <property name="date" column="DATE" type="date" />
          
          <set name="person" table="PERSON_EVENT">
              <key column="EVENT_ID" />
              <many-to-many class="com.huangchao.model.Person" column="PERSON_ID" />
          </set>
      </class>
    </hibernate-mapping>

    Person.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping >
      <class name="com.huangchao.model.Person" table="PERSON">
          <id name="id" column="PERSON_ID" type="int">
              <generator class="native"/>
          </id>
          <property name="firstname" column="FIRST_NAME" type="string" />
          <property name="lastname" column="LAST_NAME" type="string" />
          <set name="events" table="PERSON_EVENT" inverse="false">
              <key column="PERSON_ID" />
              <many-to-many class="com.huangchao.model.Events" column="EVENT_ID" />
          </set>
      </class>
    </hibernate-mapping>

    注意:inverse=true是将控制权交给对方,inverse=false是默认的,即Person掌握控制权

    至此,所有的多对多关系配置成功,

    添加测试文件测试工.

    Configuration config = new Configuration().configure();

    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySetting(config.getProperties()).build();//注册服务,hibernate从4.3开始新添的一个方法,废弃了之前的方法,该 方法更安全更方便.

    SessionFactory sessionFactory = config.buildSessinFactory(serviceRegistry);

    Session session = sessionFactory.getCurrentSession();  //getCurrentSession()相比于openSession()前者是基于当前线程的,是线程 安全的,前都不用关心session的关闭,更人性化,后者的话是每次服务启动,sessionFActory都 会创建一个session 的实例,这样对服务器的消耗更大,而且需要关心session的关闭

    Transaction tx = session.beginTransaction();

  • 相关阅读:
    【Silverlight】Bing Maps系列文章汇总
    《MEF程序设计指南》博文汇总
    Flash中各种图形的绘制
    Bing Maps开发扩展二:基于Oracle Spatial的空间数据分析
    Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
    Spring Cloud Gateway
    Spring Cloud Gateway 整合 nacos
    Spring Cloud Gateway 断言(Predicate) (hoxton 版本)
    Python和Node.js支持尾递归吗?
    用OpenCv来做人脸识别
  • 原文地址:https://www.cnblogs.com/sirab415/p/5820061.html
Copyright © 2020-2023  润新知