`
weigang.gao
  • 浏览: 468682 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics