【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

     一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式。


      一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联。                     

                                          

       

       上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的标识也是人的标识,Person类的主键作为身份证IdCard类的外键。这种一对一的主键关联关系,反应到Hibernate中是怎么着的一种实现呢?像这种关系,可以有两种方式来实现。

      

       第一种:Person中的ID不当做外键来处理,只作为Person中主键,只是人为的让Person中的ID和IdCard中的ID对应起来。在映射关系上这么处理:


IdCard.hbm.xml




	
		
			
		
		
	


Person.hbm.xml




	
		
			
			
		
		
	


IdCard类:

package com.tgb.zhudan;

public class IdCard {
	
	private int id;
	
	private String cardNo;

	public int getId() {
		return id;
	}

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

	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}
}


Person类:

package com.tgb.zhudan;

public class IdCard {
	
	private int id;
	
	private String cardNo;

	public int getId() {
		return id;
	}

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

	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}
}


hibernate.cfg.xml




	
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/hibernate_onetoone
		root
		123456
		org.hibernate.dialect.MySQLDialect
		true

		
		
	

       此时在删除IdCard表的时候,能够很容易的将其删除掉。

       这种方法的弊端:既然是人为控制,那么其实并不能很好的控制,不能很好的将Person的ID和IdCard中的ID对应起来,当我在IdCard中删除再添加一条,那么我这一条数据我应该怎么跟前面的Person对应起来。或者说我在Person中删除一条数据后,在添加当前一模一样的数据(注意此时ID已经改变,但是那么没有变),这样的话怎么跟IdCard中的ID怎么对应。所以说这种方式在实际应用中是不可取的。


       第二种:Person中ID当做主键也当做外键来处理。映射关系如下:

       主要是修改Person.hbm.xml文件。




	
		
			
			
				
				idCard
			
		
		
		
		
	

       此时在删除IdCard表时会弹出这样一个提示:

             【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联_第1张图片

提示我们不能删除,有外键约束。


总结:一句话总结一对一关联映射中的主键关联就是不需要加入多余的字段,让两个实体的主键一样。



          

      

       




你可能感兴趣的:(SSH)