`

八 一对一 用户与身份证的关系

 
阅读更多
八 一对一 用户与身份证的关系 

设计用户实体 主实体
package hibernate.bean;

public class Person {
   private int id;
   private String name;
   private IDCard idcart;
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 IDCard getIdcart() {
	return idcart;
}
public void setIdcart(IDCard idcart) {
	this.idcart = idcart;
}
}

映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="hibernate.bean">

	<class name="Person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<one-to-one name="idcart"/>
	</class>
	
</hibernate-mapping>

设计身份证实体  从实体 

package hibernate.bean;

public class IDCard {
  private int id;
  private String useDate;
  private Person person;
  public String getUseDate() {
	return useDate;
}
public void setUseDate(String useDate) {
	this.useDate = useDate;
}

public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}

public Person getPerson() {
	return person;
}
public void setPerson(Person person) {
	this.person = person;
}
}

映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.bean">
 <class name="IDCard" table="id_card">
  <id name="id">
     <!-- 设置主键为外键  关联的是主实体的id-->
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
  </id>
  <property column="use_date"  name="useDate"/>
  <one-to-one name="person"/>
 </class>
</hibernate-mapping>

测试



package hibernate.test;

import hibernate.bean.IDCard;
import hibernate.bean.Person;
import hibernate.util.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class OneToOne {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		add();
		query(1);
	}
   static Person add(){
	   Session session=null;
	   Transaction tx=null;
	   try{
		   session=HibernateUtil.getSession();
		   tx=session.beginTransaction();
		   IDCard idcard=new IDCard();
		   idcard.setUseDate("有效期三年");
		  
		   Person person=new Person();
		   person.setName("许春荣");
		  // person.setIdcart(idcard);
		   idcard.setPerson(person);
		   session.save(person);
		   session.save(idcard);
		   tx.commit();
		   return person;
	   }finally{
		   if(session!=null) session.close();
	   }
   }
   
   static void query(int id){
	   Session session=null; 
	   try{
		   session=HibernateUtil.getSession();
		   Person person=(Person)session.get(Person.class, id);
		   System.out.println(person.getName()+"-------->"+person.getIdcart().getUseDate());
	   }finally{
		   if(session!=null) session.close();
	   }
   }
}


分析:在执行后,我们可以去查看一下从实体下的表结构 在命令行输入 show create table id_card 

源码为 ddl语句 
CREATE TABLE `id_card` (
  `id` int(11) NOT NULL,
  `use_date` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

发现生成的表的主键少了一个定义,根据我们的设计 id_card表的id 不但要是主键也要是外键,它引用的是
person表的主键 为什么是这样呢?其实这样并不会影响我们程序的实体的实现效果,为了设计更合理,我们必须要注意
在Person的映射文件的one-to-one节点中 少了一个属性constrained定义,加上<one-to-one name=”idCard” constrained=”true”/>

ddl语句
CREATE TABLE `id_card` (
  `id` int(11) NOT NULL,
  `use_date` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK627C1FB461BB04F2` (`id`),
  CONSTRAINT `FK627C1FB461BB04F2` FOREIGN KEY (`id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这样是不是更合理呢 


下面我们来看第二种一对一的设计方式 
上面的这种设计方式是把从表的主键id是依赖于主表的主键id而建立的 
我们可不可以改变这样的设计方式,而在从表中额外加入一个外键呢 
但是,如果我们这样做的话,我们可以在从表下根据一个主表的id,而在从表中加入多条数据
这样不就是多对一的关系了吗?是这样的,但是我们是否可以把这个外键同时也设置为唯一键呢
哈哈,这不就好了,这只是要修改映射文件即可实现,怎么修改的 请看吧 

Person实体的映射文件
修改前
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="hibernate.bean">

	<class name="Person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<one-to-one name="idcart"/>
	</class>
	
</hibernate-mapping>


修改后
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="hibernate.bean">

	<class name="Person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 这里的property-ref="person" 是IDCard的属性 用这来告诉hibernate的从实体隶属于Person 
		-->
		<one-to-one name="idcart" property-ref="person"/>
	</class>
	
</hibernate-mapping>




IDCard的映射文件
修改前
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.bean">
 <class name="IDCard" table="id_card">
  <id name="id">
     <!-- 设置主键为外键  关联的是主实体的id-->
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
  </id>
  <property column="use_date"  name="useDate"/>
  <one-to-one name="person" constrained=”true”/>
 </class>
</hibernate-mapping>


修改后的
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.bean">
 <class name="IDCard" table="id_card">
  <id name="id">
     <!-- 设置主键为外键  关联的是主实体的id-->
     <!--
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
   -->
   <generator class="native"/>
  </id>
  <property column="use_date"  name="useDate"/>
  <!-- 在这里加入了many-to-one 而不是one-to-one 并且指定其隶属的实体 Person unique是指定其唯一键 
  column制定其唯一键的列名  -->
 <many-to-one name="person" unique="true" column="person_id"/>
 </class>
</hibernate-mapping>


然后就可以运行测试文件 成功执行 

现在我们来查看id_card表的ddl语句 show create table id_card;

CREATE TABLE `id_card` (
  `id` int(11) NOT NULL auto_increment,
  `use_date` varchar(255) default NULL,
  `person_id` int(11) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `person_id` (`person_id`),
  KEY `FK627C1FB49495921C` (`person_id`),
  CONSTRAINT `FK627C1FB49495921C` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

发现person_id是个外键 并且还是个唯一键 
到这里一对一的映射就完成了 

完毕 end!

 

分享到:
评论

相关推荐

    C#身份证验证器

    解析身份证所在地址通常需要一个地区代码库,这个库包含了所有省份、城市和区县的对应关系。开发人员会将这个数据结构化并存储在数据库或字典中,通过地区码查询到对应的地址信息,并在验证成功后展示给用户。 总的...

    身份证头部号段与地区对应数据.rar

    本资源“身份证头部号段与地区对应数据.rar”提供了全国范围内身份证前几位数字(号段)与对应地区的映射关系,这对于验证身份证的初步合法性以及进行数据分析具有重要意义。 首先,我们要了解身份证号的结构。...

    hibernate一对一关联关系

    一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作这些具有唯一对应关系的数据。 1. **配置一对一关联**...

    身份证信息管理系统

    《身份证信息管理系统》是一款基于数据结构的本科生课程设计项目,主要目标是实现对个人身份证信息的有效管理和查询。在这个系统中,作者运用了数据结构的基本原理和算法,为身份证信息的存储、检索和更新提供了高效...

    PHP身份证号码归属地查询应用实例

    - `card_address.csv` 和 `card_address_two.csv` 文件可能存储了全国地区的身份证号码与归属地对应关系。CSV(Comma Separated Values)是一种常见的数据交换格式,用于存储表格数据。在PHP中,我们可以使用内置的...

    安卓读取二代身份证完整代码

    在安卓平台上,通过NFC(Near Field Communication)技术读取二代身份证信息是一项常见的功能,尤其在需要验证用户身份的应用场景中。本项目提供了一个完整的代码实现,可以直接在Android Studio环境中编译并运行,...

    身份证号码对应省市区

    在IT行业中,尤其是在移动应用开发领域,理解和处理身份证号码与省市区对应关系是一项常见的任务。身份证号码不仅是个人身份的重要标识,也是进行地理位置关联的关键数据。本文将深入探讨这个主题,特别是针对...

    pb的身份证读卡器源代码

    4. **用户界面**:提供一个友好的界面展示身份证信息,可能包括输入验证、数据格式化等。 5. **安全措施**:确保敏感信息的安全,遵循相关的法律法规,防止非法访问或滥用。 6. **日志记录**:记录读卡操作,便于...

    万能身份证驱动

    3. "U盘量产网.url":这是一个链接,可能指向一个网站,提供关于U盘生产和维护的信息,虽然与身份证驱动直接关系不大,但可能对用户有所帮助,比如在没有身份证读卡器的情况下,使用特定的U盘进行数据传输。...

    hibernate 一对一 多对多的关系

    例如,一对一关系可能适用于用户和其唯一账号的关联,而多对多关系则适用于用户和角色的分配,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。理解并熟练运用这些关系映射,对于开发高效、稳定的Java企业...

    身份证号码区域查询数据库 (mysql 格式)

    在这个特定的案例中,"data.sql"文件包含了一系列的MySQL语句,用于创建和填充一个包含全国各地身份证号码与对应区域信息的数据库表。 首先,这个数据库可能包含以下字段: 1. `id`: 主键,唯一标识每一项记录,...

    身份证驱动程序

    安装和更新正确的身份证驱动程序对于保证身份证读卡器的正常运行至关重要,同时也关系到用户隐私的保护。因此,用户和管理员在操作时需要确保驱动程序的版本是最新的,并遵循官方提供的安装和配置指南。

    246-基于SpringBoot的身份证识别系统(源码+数据库)

    使用Java语言开发,同时提供了完整的源代码,这对学习者来说是一个宝贵的资源,可以借此了解如何在实际项目中应用SpringBoot框架,以及如何结合OCR技术实现身份证信息的自动识别。 在压缩包文件名称列表中,只有一...

    查询身份证的所在地源码

    1. **数据结构与数据库**:查询身份证所在地,首先需要一个包含所有中国行政区域代码的数据结构,这可能是一个数据库表或者JSON文件,存储了省份、城市、区县的对应关系。 2. **编码与解码**:身份证号码的前6位...

    身份证验证系统 java

    如果需要联网获取个人信息,可能还需要使用HTTP请求库(如Apache HttpClient或OkHttp)与服务器交互,发送身份证号码请求个人基本信息,并对返回的数据进行解析,这可能涉及到JSON或XML的解析技术。 此外,使用...

    Hibernate ORM - 一对一连接表关联关系

    标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...

    身份证号解读 C#应用程序

    - Access数据库是一种关系型数据库,常用于小型应用。C#可以通过ADO.NET库进行数据操作。 - 使用`OleDbConnection`类建立与数据库的连接,`OleDbCommand`类执行SQL语句,如查询、插入、更新和删除数据。 - `...

    textwatcher实现身份证籍贯信息的自动填充

    因此,我们的目标是建立一个映射关系,将身份证号的前六位与对应的籍贯信息关联起来。 为了实现这一功能,我们首先需要准备一个JSON文本文档,该文档包含所有省份和对应行政区域代码的映射。JSON(JavaScript ...

    Mybatis实现一对一,一对多数据插入数据实验报告.docx

    Mybatis,一个优秀的持久层框架,提供了方便的方式来处理复杂的数据关系,包括一对一和一对多的关系。这篇实验报告将详细阐述如何在Mybatis中实现这两种关系的数据插入。 1. **一对一关系** - **定义**:一对一...

    身份证的校验码 可用源码

    身份证的校验码,也称为身份证号码的最后一位数字,是根据前17位数字通过特定算法计算得出的,用于验证整个身份证号码的正确性。这个校验码的计算涉及到一系列复杂的数学逻辑,包括模运算、加权求和以及模11余数规则...

Global site tag (gtag.js) - Google Analytics