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

    基于外键的双向一对一关联映射

    需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用。

    还是通过刚才用户和地址来演示双向一对一关联。

    代码演示

    一、实体类

    Account.cs,需要添加被控端的引用

    package com.lxit.entity;
    
    import java.io.Serializable;
    
    public class Account implements Serializable{
        public Account(){
            
        }
        private int id;
        private String name;
        private String password;
        //需要添加被控端的引用
        private Address address;
        
        
        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 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.cs,被控端也需要添加主控端的引用

    package com.lxit.entity;
    
    import java.io.Serializable;
    
    public class Address implements Serializable{
        public Address(){
            
        }
        private int id;
        private String name;
        
        //双向1对1,被控端也知道主控端的引用
        private Account account;
        
        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 Account getAccount() {
            return account;
        }
        public void setAccount(Account account) {
            this.account = account;
        }    
    }

    二、映射文件

    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="com.lxit.entity.Account" table="Account">
      <id column="id" name="id">
       <generator class="native"/>
      </id>
      <property column="name" generated="never" lazy="false" name="name"/>
      <property column="password" generated="never" lazy="false" name="password"/>
      <!-- 通过many-to-one 标签添加唯一属性约束,建立一对一关联关系 -->
      <many-to-one column="address_id" name="address" 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="com.lxit.entity.Address" table="Address">
      <id column="id" name="id">
       <generator class="native"/>
      </id>
      <property column="name" generated="never" lazy="false" name="name"/>
      
      <!-- one-to-one 映射一对一关联,name对应当前类的引用属性,property-ref属性:指定account类的属性引用 -->
      <one-to-one name="account" property-ref="address"></one-to-one>
     </class>
    </hibernate-mapping>

    jUtilTest

    package com.lxit.demo2.test;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    import org.junit.Test;
    
    import com.lxit.entity.Account;
    import com.lxit.entity.Address;
    import com.lxit.util.HibernateUtil;
    
    
    public class AccountTest {
        
        @Test
        public void createTable(){
            Configuration cfg = new Configuration().configure();
            SchemaExport se = new SchemaExport(cfg);
            se.create(true, true);
        }
        
        @Test
        public void Add(){
            Transaction tx = null;
            Session session = HibernateUtil.getSession();
            tx = session.beginTransaction();
            
            Address address= new Address();
            address.setName("深圳宝安");        
            session.save(address);
            
            Account account = new Account();
            account.setName("zhangsan");
            account.setPassword("123");
            account.setAddress(address);
            
            try {
                session.save(account);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally{
                HibernateUtil.CloseSession(session);
            }
            
        }
        
        @Test
        public void Add2(){
            Transaction tx = null;
            Session session = HibernateUtil.getSession();
            tx = session.beginTransaction();
            
            Address address= new Address();
            address.setName("深圳福田");        
            session.save(address);
            
            Account account1 = new Account();
            account1.setName("lisi");
            account1.setPassword("123");
            account1.setAddress(address);
            
            Account account2 = new Account();
            account2.setName("wangwu");
            account2.setPassword("123");
            account2.setAddress(address);
            
            try {
                //重复添加第二个用户,地址相同,则会报错
                session.save(account1);
                session.save(account2);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally{
                HibernateUtil.CloseSession(session);
            }
            
        }
    }
  • 相关阅读:
    python笔记之re模块学习
    python笔记之面向对象
    C# 静态类和非静态类(实例类)
    占位符的使用
    数据类型和数据类型转换
    win7 安装 memcached
    php 汉字转换成拼音
    apache window环境下本地配置虚拟主机
    在浏览器输入一个网址到得到页面的过程
    浅谈线程池ThreadPoolExecutor核心参数
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/5447968.html
Copyright © 2011-2022 走看看