Hibernate 关系映射之一对一关联

阅读更多

Hibernate 关系映射之一对一关联

Hibernate 最核心的功能是解决O/RMapping和事务处理。所以在此不得不论及Hibernate 关系映射

 

当然,这里说的映射其实是对象之间的关系并不是指数据库的关系,因为Hibernate是对象化操作。

 

因为做项目的时候频繁使用了关系映射,在此过程中学习了尚学堂马士兵老师的Hibernate教程,结合自己的体会,和各位道友分享一下。

主要关系:

  • 一对一
  • 多对一
  • 一对多
  • 多对多

以上假如要细分的话下以层级还有单向关联、多向关联。

主要是这6种(一对多和多对一本质上没差),

当然还有集合映射,继承映射。不过暂时还用的少。

 

 

一、一对一单向关联映射

前提:两个对象之间是一对一的关系,如Person-IdCard(人—身份证号)

 那么有两种策略可以实现一对一的关联映射

  •  主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
  •  唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。

对象模型

实体类:

/** 人-实体类 */

 

public class Person {
    private int id;
    private String name;
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
}
 

 

 

/**身份证-实体类*/

 

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(StringcardNo) {this.cardNo = cardNo;}
}
 

 

(一)唯一外键关联(单向) 

1、对象模型

Hibernate 关系映射之一对一关联_第1张图片
 

 

2、关系模型 

Hibernate 关系映射之一对一关联_第2张图片
 
 

3.1、实体映射关联(xml方式)

使用标签关联,并使用unique="true"唯一性约束。

 


  
      
          
      
      
  

  


  
      
          
      
       
      
      
  

 


3.2、实体映射关联(annotation方式) 

使用@OneToOne进行注解,来体现是一对一的关系

    IdCard类 

@Entity
public class IdCard {
    private int id;
    private String cardNo;
    @Id
    @GeneratedValue
    public int getId() {return id;}
    public void setId(int id) {this.id = id;} 
    public String getCardNo(){ return cardNo;}
    public void setCardNo(StringcardNo) {this.cardNo = cardNo;}
}

 

    Person类  

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加对象
    @Id
    @GeneratedValue
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一对一的关系
    @JoinColumn(name="card_id") //为外键指定名称
    public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}

 

 

(二) 主键关联(单向) 

1、对象模型 

Hibernate 关系映射之一对一关联_第3张图片
 

2、关系模型

Hibernate 关系映射之一对一关联_第4张图片
 

3.1、主键单向关联(xml方式)

IdCard映射文件,先生成ID 

 

  
        
            
        
        
    
 

 

Person实体类映射文件,ID是根据IdCard主键值,主键生成策略不能使用native或者identity了,而是  foreign  

 


        
             
                idCard
            
        
         
         

 

 

 

 3.2、主键单向关联(annotation方式)

使用@OneToOne注解一对一关系,再使用@PrimaryKeyJoinColumn来注解主键关系映射。

Person类 

 

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加对象
    @Id 
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一对一的关系  

       @PrimaryKeyJoinColumn//注解主键关联映射 

    public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}

 

 

二、一对一双向关联映射

上面的示例可以通过身份证idCard来找到相应的人Person,而反过来却不能查询。所以就有了一对一双向关联。

例如:夫妻关系就是一对一双向关联关系,通过丈夫可以找到妻子,通过妻子也可以找到丈夫。

 

(一)唯一外键关联(双向) 

annotation方式:只需要在未加关联的注解mappedBy就ok了 

 

@Entity
public class Husband {
	private int id;
	private String name;
	private Wife wife;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	
	public String getName() {
		return name;
	}
	@OneToOne
	@JoinColumn(name="wifeId")
	public Wife getWife() {
		return wife;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setWife(Wife wife) {
		this.wife = wife;
	}
	
}

 

 @Entity
public class Wife {
	private int id;
	private String name;
	private Husband husband;
	@OneToOne(mappedBy="wife")
	public Husband getHusband() {
		return husband;
	}
	public void setHusband(Husband husband) {
		this.husband = husband;
	}
	@Id
	@GeneratedValue
	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;
	}
	
}

 

 

 2、xml方式:使用标签,并设置对应的关联类 

 


        
            
         
        
 

 

 

 

  • Hibernate 关系映射之一对一关联_第5张图片
  • 大小: 5.6 KB
  • Hibernate 关系映射之一对一关联_第6张图片
  • 大小: 6.6 KB
  • Hibernate 关系映射之一对一关联_第7张图片
  • 大小: 7.2 KB
  • Hibernate 关系映射之一对一关联_第8张图片
  • 大小: 9.3 KB
  • 查看图片附件

你可能感兴趣的:(Hibernate,O/RMaping,关联映射,一对一,关系)