zoukankan      html  css  js  c++  java
  • Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。基于外键的单向1-1的配置将与无连接表N-1关联的many-to-one增加unique="true"属性即可。

    一、模型介绍

    一个人(account)对应一个地址(address)。

    二、实体

    account类

    package entity;
    
    import java.io.Serializable;
    public class account implements Serializable{
            public account(){
                
            }
            // 建议hibernate中不用使用id,name这种关键字 可能会报错
    private int account_id; private String account_name; private String password; //需要添加被控端的引用 此处添加的是对应关系 即一个人对应一个地址的地址对象
    private address address; public int getAccount_id() { return account_id; } public void setAccount_id(int account_id) { this.account_id = account_id; } public String getAccount_name() { return account_name; } public void setAccount_name(String account_name) { this.account_name = account_name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public address getAddress() { return address; } public void setAddress(address address) { this.address = address; } }

    address实体类

    package entity;
    
    import java.io.Serializable;
    
    public class address implements Serializable{
            public address(){    
            }
            private int address_id;
            private String address_name;
            
            public int getAddress_id() {
                return address_id;
            }
            public void setAddress_id(int address_id) {
                this.address_id = address_id;
            }
            public String getAddress_name() {
                return address_name;
            }
            public void setAddress_name(String address_name) {
                this.address_name = address_name;
            }        
    }

    映射关系配置
    account.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name = "entity.account" table ="account">
        <id  column = "account_id" name = "account_id">
          <generator class="native"/>  <!--主键生成方式  所以在创建表的时候要主键自增
    -->    </id>
        <property name="account_name" type = "java.lang.String" column = "account_name"/>
        <property name="password" type="java.lang.String" column = "password"/>
         <!-- 通过many-to-one 标签添加唯一属性约束,建立一对一关联关系 
    此处映射的意思是 account的adress属性对应着外表的address_id列 且填加了唯一约束 说明address_id是唯一的

    --> <many-to-one name="address" column="address_id" unique="true"/> <!-- 必须通过映射关系生成的表才会生成唯一约束,否则不会生成 --> </class> </hibernate-mapping>

    address.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
         <class name = "entity.address" table = "address">
          <id name="address_id" column="address_id">
          <generator class="native"/>
          </id>
          <!-- generated= never  标明此属性值不是从数据库中生成。generated默认值是never。
               generated= insert  标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。
               generated= always  标明此属性值在insert和update时都会被生成
           -->
          <property name="address_name" type = "java.lang.String" column = "address_name" generated="never" lazy="false"/>
         </class>
    </hibernate-mapping>

    这里讲通用逻辑封装成了一个方法了

    /**
     * @author Administrator
     *
     */
    package HibernateUtil;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        private static SessionFactory factory;
        static{
            Configuration cnn = new Configuration().configure();
            factory = cnn.buildSessionFactory();
        }
        public static SessionFactory getSessionFactory(){
            return factory;
        }
        public static Session getOneSession(){
            return factory.openSession();
        }
        public static void ClossSession(Session session){
            if(session != null){
                session.close();
            }
        }
    }

    建表就不说了但是注意不要忘记创建自增和索引名字必须是Hibernate.sequence .
    hibernate.hbm.xml同Hibernate学习一中的配置只是添加了映射文件 <mapping resource="account.hbm.xml"/><mapping resource="address.hbm.xml"/>

    测试

    package text;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import entity.account;
    import entity.address;
    
    import HibernateUtil.HibernateUtil;
    
    public class textManytoOne {
        
       @Test
       public void add(){
           Transaction tx = null;
           Session session = HibernateUtil.getOneSession();
           tx=session.beginTransaction();
           
          address address = new address();
           address.setAddress_name("天津");
           session.save(address);
          
           account account = new account();
           account.setAccount_name("大伟哥666");
           account.setPassword("123456");
           account.setAddress(address);
           
           // 重复添加
    
           account account1 = new account();
           account1.setAccount_name("小老虎666");
           account1.setPassword("123456");
           account1.setAddress(address);
          
          try{
          session.save(account);
          session.save(account1);
          tx.commit();
          }catch(HibernateException e){
              e.printStackTrace();
              tx.rollback();
          }finally{
              HibernateUtil.ClossSession(session);
          }
       }
    }

    总结注意
    1.在多表实体类中记得添加被控端的对象的引用 且属性名字最好不用和关键字冲突

    2.要在多表的映射文件中写上<many-to-one name="被控端引用对象" column="外键 也就是另一张表的主键" unique="是否对外键加唯一">

    3.创建表的时候主键索引名字是Hibernate.sequence 不知道为什么  但是我的名字不是这个就报错

    4.Hibernate的配置文件中记得添加实体类的映射文件 <mapping resource="xxx.hbm.xml">

  • 相关阅读:
    Cookie 学习笔记
    IEDA的图片视频等文件在Tomcat上部署不能访问的问题
    JavaWeb 的路径访问问题,以及路径命名规则。
    HttpServlet 的 Request 方法 学习笔记
    Servlet概念 ,体系结构及配置 HTTP概念
    XML学习笔记
    IDEA创建Tomcat服务器,以及新创建的JaveWeb项目(JavaEE)如何部署在Tomcat上,以及出现404的原因,以及一些设置。
    IDEA将多个项目创建在同一个文件夹下,及创建JavaWeb项目方法
    Spring JDBCTemplate对象的增删查改写法 学习笔记
    Druid 数据库连接池技术(JDBCUtils工具类的编写) 学习笔记
  • 原文地址:https://www.cnblogs.com/daweige/p/8032580.html
Copyright © 2011-2022 走看看