`
weigang.gao
  • 浏览: 491433 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一对一单向关联

 
阅读更多

问题1:一对一单向和一对一双向有什么区别呀?单向和双向在数据库中的表现都一样吗?没错,在数据库里面一对一单向和一对一双向其实没区别,在后面学的一对多,多对多都一样,数据库没什么区别,但是它的区别主要在外面java程序里面有区别(eg,(hibernate-One2one-test)如果我们双向的,我们可以通过Wife找到Husband,如果我们是单向我们就不能通过Wife找到Husband;所谓单向双向的映射的意思是:在同样的数据库的基础之上,你要实现单向的编程模型你该怎么映射,如果你要实现双向的变成模型你该怎么映射

1.一对一单向外键关联

     A)  Annotation: @OneToOne @JoinColunm

     B)  xml: <many-to-one name="studentcard" column="studentId" unique="true"/> 

情景:每个人都有一张身份证,一张身份证当然属于一个人。

工程的目录结构以及所需要的jar包如下:


①People.java类的编写如下:

package com.bjsxt.hibernate;

import java.util.Date;

public class People {
	
	private int id;
	
	private String name; //姓名
	
	private int age;  //年龄
	
	private Date birthday; //出生日期
	
	private boolean sex;//性别  true: 男, false:女
	
	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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}

}
 ②IdentityCard类的编写如下:
package com.bjsxt.hibernate;

public class IdentityCard {
	
	private int id;
	
	private String identityNO; //身份证号
	
	//一对一单向外键关联,只需要在IdentityCard进行配置
	private People people; //一个身份证肯定只属于某一个人
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getIdentityNO() {
		return identityNO;
	}
	public void setIdentityNO(String identityNO) {
		this.identityNO = identityNO;
	}
	
	public People getPeople() {
		return people;
	}
	public void setPeople(People people) {
		this.people = people;
	}

	
}

③People.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">

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.People" dynamic-update="true">
		<id name="id">
			<generator class="native"></generator>
		</id>
		
		<property name="name"></property>
		<property name="age" />
		<property name="birthday" type="date"/>
		<property name="sex" type="yes_no" />
    </class>
	
</hibernate-mapping>

 ④IdentityCard.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">

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.IdentityCard">
		<id name="id">
			<generator class="native"></generator>
		</id>
		
		<property name="identityNO"/>
		
		<!-- unique 说明 fk_people_id具有唯一性 -->
		<many-to-one name="people" column="fk_people_id" unique="true"></many-to-one>
    </class>
	
</hibernate-mapping>

 ⑤使用hibernate的SchemaExport来自动创建表

package com.bjsxt.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
public class HibernateORMappingTest {	
	
	@Test
	public void testSchemaExport() {
		new SchemaExport(new Configuration().configure()).create(true, true);
	}
	
}

⑥执行HibernateORMappingTest 生成的表结构如下

IdentityCard的表结构如下:


People的表结构如下:

 

 

 

2.一对一双向外键关联(规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外键关联,在数据库中只要定义一边就可以了)

     A)  Annotation: @OneToOne(mappdBy=””)

     B) xml:<many-to-one 和<one-to-one;    用<one-to-one这样只会在一张表上生成外键;而不要用 <many-to-one,因为 <many-to-one会在2张表上生成外键关联

①IdentityCard类编写

package com.bjsxt.hibernate;

public class IdentityCard {
	
	private int id;
	
	private String identityNO; //身份证号
	
	//一对一双向外键关联,两个类中都需如此要配置
	private People peoplet; //一个身份证肯定只属于某一个人
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getIdentityNO() {
		return identityNO;
	}
	public void setIdentityNO(String identityNO) {
		this.identityNO = identityNO;
	}
	public People getPeoplet() {
		return peoplet;
	}
	public void setPeoplet(People peoplet) {
		this.peoplet = peoplet;
	}
}

②People的编写如下:

package com.bjsxt.hibernate;

import java.util.Date;

public class People {
	
	private int id;
	
	private String name; //姓名
	
	private int age;  //年龄
	
	private Date birthday; //出生日期
	
	private boolean sex;//性别  true: 男, false:女
	
	/*一对一双向外键关联,<one-to-one name="identityCards" property-ref="people"></one-to-one>
	 * name的值与此成员变量对应
	 * property-ref的与IdentityCard中的成员变量对应
	 */
	private IdentityCard identityCards;
	
	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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}
	public IdentityCard getIdentityCards() {
		return identityCards;
	}
	public void setIdentityCards(IdentityCard identityCards) {
		this.identityCards = identityCards;
	}

}

③IdentityCard.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">

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.IdentityCard">
		<id name="id">
			<generator class="native"></generator>
		</id>
		
		<property name="identityNO"/>
		
		<!-- unique 说明 fk_people_id具有唯一性,在创建表IdentityCard时会在表IdentityCard中添加该约束 -->
		<many-to-one name="peoplet" column="fk_people_id" unique="true"></many-to-one>
    </class>
	
</hibernate-mapping>

 ④People.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">

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.People" dynamic-update="true">
		<id name="id">
			<generator class="native"></generator>
		</id>
		
		<property name="name"></property>
		<property name="age" />
		<property name="birthday" type="date"/>
		<property name="sex" type="yes_no" />
		<!-- 
		 identityCards 对应People类中的成员变量。必须对应,否者会报错。
		 peoplet 对应 IdentityCard类中的成员变量。必须对应,否者会报错。
		 -->
	    <one-to-one name="identityCards" property-ref="peoplet"></one-to-one>
    </class>
	
</hibernate-mapping>

 ⑤执行测试类,hibernate帮我们生成的表结构与一对一单向关联生成的表结构一样。

 

3.一对一单向主键关联(不重要)

      A)Annotation :@OneToOne @PrimaryKeyJoinColumn

      B) xml: <one-to-one name="studentcard" constrained="true"/>

 

4.一对一双向主键关联(不重要)

  • 大小: 18.1 KB
  • 大小: 16.3 KB
  • 大小: 14.5 KB
分享到:
评论

相关推荐

    有关ssh一对一单向关联以及登陆的分页小例子

    首先,SSH一对一单向关联指的是一个SSH客户端仅能连接到指定的一个SSH服务器,而不能连接其他服务器。这种配置常用于提高安全性,限制特定用户或系统只能访问特定资源,防止非法或未经授权的访问。 实现SSH一对一...

    hibernate主键实现一对一单向关联关系源码

    本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...

    hibernate外键实现一对一单向关联关系源码

    在这个例子中,我们很可能看到的是第一种情况,即在一方实体中定义外键,以实现与另一方实体的一对一单向关联。 **源码实现步骤**: 1. **实体类定义**:创建两个实体类,例如`Person`和`Passport`。`Person`实体...

    Hibernate教程06_关系映射之一对一单向主键关联

    2. **单向关联:** 在一对一单向关联中,只有其中一个实体类(称为拥有端)知道另一方实体(称为无拥端)。无拥端实体类没有外键字段或属性指向拥有端。 3. **主键关联:** 在这种关联中,一方实体的主键作为另一方...

    Hibernate 一对一外键单向关联

    本篇文章将深入探讨Hibernate中的一对一外键单向关联。 首先,一对一外键关联指的是一个实体通过外键直接引用另一个实体的主键。在单向关联中,只有其中一个实体知道另一个实体的存在,而另一个实体则无感知。这种...

    hibernate一对一之唯一外键关联(单向关联)

    在这个场景下,我们将讨论一种特殊的一对一关联方式——唯一外键关联(Single ForeignKey Association),且为单向关联。这种关联方式意味着在一个实体中有一个字段作为另一个实体的主键引用。 首先,我们需要理解...

    hibernate多对一单向关联关系实现源码

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    Hibernate一对一主键关联映射(单向关联)

    本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个实际的例子来帮助理解。 在一对一主键关联映射中,两个实体共享同一个主键,这意味着它们在数据库中的记录具有相同的标识符。这种映射关系通常用于...

    Hibernate教程04_关系映射之一对一单向外键关联

    **标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...

    Hibernate 一对一连接表单向关联

    以上就是关于Hibernate中一对一单向关联的详细解释,包括注解和XML配置方式,以及级联操作、懒加载、外键约束等概念。理解和掌握这些知识,将有助于你在实际开发中更加熟练地使用Hibernate进行数据持久化操作。

    一对多单向关联关系实现元源码

    在Java编程语言中,特别是在开发基于JPA(Java Persistence API)和ORM(对象关系映射)框架如Hibernate的应用时,一对多单向关联关系是一种常见的数据模型设计。这种关系表示一个实体可以与多个其他实体相关联,而...

    Hibernate单向关联代码示例

    单向关联分为单向一对一关联和单向一对多关联。这里我们先讨论单向一对多关联,它是最常见的关联类型之一,一个实体可以拥有多个其他实体实例。例如,一个部门可以有多个员工,但员工并不知道属于哪个部门,这就是...

    Hibernate 一对一

    **一对一单向关联** 在单向一对一关联中,只有一个实体知道另一个实体的存在。例如,User类可能有一个PersonalInfo属性,但PersonalInfo类没有User属性。配置方法与双向关联类似,只是在PersonalInfo类中不需要任何...

    Hibernate一对一唯一外键关联映射(单向关联)

    本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体操作。 在一对一的关联中,两个实体类之间存在一对一的关系,比如一个用户只有一个身份证,或者一辆...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    eshop1.0(ssh电子商城)

    ESho1.0版本主要实现项目的创建,数据库的创建与ORM映射. [创建项目与数据库] 1."电子商城系统"EShop应用项目的创建 ...12.配置订单到购物车的一对一单向关联关系 13.配置购物车到商品的多对多单向关联关系

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    Hibernate一对一单向外键关联(annotation/xml)

    本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...

Global site tag (gtag.js) - Google Analytics