EJB学习日记(9)

实体BEAN的七种关系之---------一对一双向
One-to-One Bidirectional Relationship

一对一双向的情况其实在现实生活中也是挺常见的,最常见的就是人和身份证的关系了,我们每个人都有一个身份证(只要你年满16岁,并且申请了),并且每个身份证都对应一个人,我们可以根据一个人查到他的身份证号码,也可以根据一个身份证号码查到一个人的具体情况,(第一代身份证重码的情况还是有的:(   ) .好了,闲话不多说,还是看看代码吧.

先定义一个Person类

/*
 * Person.java
 * 
 * Created on 2007-9-15, 0:11:58
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package  lbf.entitybean.test1;

import  java.io.Serializable;
import  java.util.List;
import  javax.persistence.CascadeType;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.OneToMany;
import  javax.persistence.OneToOne;

/**
 *
 * 
@author  Admin
 
*/
@Entity
public   class  Person  implements  Serializable {
    
private  IDCard idCard;
    
private   static   final   long  serialVersionUID  =   1L ;
    
private  Long id;
    
private  String name;
    
private  String sex;
    
private   int  age;
    
private  Address address;
    
    @OneToOne(cascade
= CascadeType.ALL,optional = true )
    
public  Address getAddress() {
        
return  address;
    }

    
public   void  setAddress(Address address) {
        
this .address  =  address;
    }
    
public   int  getAge() {
        
return  age;
    }

    
public   void  setAge( int  age) {
        
this .age  =  age;
    }

    
public  String getName() {
        
return  name;
    }

    
public   void  setName(String name) {
        
this .name  =  name;
    }

    
public  String getSex() {
        
return  sex;
    }

    
public   void  setSex(String sex) {
        
this .sex  =  sex;
    }
    
public   void  setId(Long id) {
        
this .id  =  id;
    }

    @Id
    @GeneratedValue(strategy 
=  GenerationType.AUTO)
    
public  Long getId() {
        
return  id;
    }

    @OneToOne(cascade
= {CascadeType.ALL},optional = true )
    
public  IDCard getIdCard() {
        
return  idCard;
    }

    
public   void  setIdCard(IDCard iDCard) {
        
this .idCard  =  iDCard;
    }


}


IDCard类

/*
 * IDCard.java
 * 
 * Created on 2007-9-18, 17:05:51
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package  lbf.entitybean.test1;

import  java.io.Serializable;
import  javax.persistence.CascadeType;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.OneToOne;

/**
 *
 * 
@author  hadeslee
 
*/
@Entity
public   class  IDCard  implements  Serializable {
    
private   static   final   long  serialVersionUID  =   1L ;
    
private  Long id;
    
private  Person person;
    
private  String cardNumber;
    
public  String getCardNumber() {
        
return  cardNumber;
    }

    
public   void  setCardNumber(String cardNumber) {
        
this .cardNumber  =  cardNumber;
    }
    @OneToOne(cascade
= CascadeType.ALL,mappedBy = " idCard " ,optional = false )
    
public  Person getPerson() {
        
return  person;
    }

    
public   void  setPerson(Person person) {
        
this .person  =  person;
    }
    
public   void  setId(Long id) {
        
this .id  =  id;
    }
    @Id
    @GeneratedValue(strategy 
=  GenerationType.AUTO)
    
public  Long getId() {
        
return  id;
    }
    

}

在这里我们可以看到一对一单向和一对一双向其实差别也不是很大,无非就是在对方的类里面也定义了一个自己,这样就互相都能找到对方了,在数据表的表现来看,和一对一单向是一模一样的,都是从Person表里面起一个外键连到IDCard的主键.但是只有这种方法吗?

在Person类里面,定义的IDCard注释是和Address一样的,可是我们在IDCard里面定义的注释却和Person里面的不一样:

@OneToOne(cascade=CascadeType.ALL, mappedBy="idCard",optional=false)
    public Person getPerson() {
        return person;
    }
多了一个mappedBy这个方法,它表示什么呢?它表示此表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表是一对一关系中的从表,也就是关系是在person表里面维护的,这一点很重要.

我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让 Person来维护整个关系,这样更符合我们正常的思维.

我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值