ejb笔记一 one to one

来源:互联网 发布:网络打电话软件哪个好 编辑:程序博客网 时间:2024/05/17 12:51

 

 

一对一关系需要在关系维护端(owner side)的@OneToOne注释中定义mappdBy属性,在关系被维护端(inverse side)建立外键列指向关系关系维护端的主键列。

 

关系被维护端 IDCard.java代码如下

 

 

@SuppressWarnings("serial")
@Entity
@Table(name 
= "IDCard")
public class IDCard  implements Serializable{
    
private Integer id;
    
private String cardno;    
    
private Person person;
  
    
public IDCard() {
    }

    
    
public IDCard(String cardno) {
        
this.cardno = cardno;
    }

    
    @Id
    @GeneratedValue   
    
public Integer getId() {
        
return id;
    }

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

    
    @Column(nullable
=false,length=18,unique = true)
    
public String getCardno() {
        
return cardno;
    }

    
public void setCardno(String cardno) {
        
this.cardno = cardno;
    }

    
//@JoinColumn列名为Person_ID作为外键 对应Person表的personid列
    @OneToOne(optional = false, cascade = CascadeType.REFRESH)
    @JoinColumn(name 
= "Person_ID", referencedColumnName = "personid",unique = true)  
    
public Person getPerson() {
        
return person;
    }

    
public void setPerson(Person person) {
        
this.person = person;
    }

    
}

 

关系维护端代码Person.java

 

@SuppressWarnings("serial")
@Entity
/**
 * name="Person" 表示数据库中表名为Person 
 * 如果省略此条注释,则数据库默认表明为Person 即类名 
 * 若想另外命名,可省略@Table
 * 
 
*/

@Table(name 
= "Person")
public class Person  implements Serializable{
    
//@Column列的注释可以放在定义属性前,也可以放在get方法前
    private Integer personid;
    
/**
    * @Column可以省略
    * name = "PersonName"表示数据库里此表中的列名为PersonName, 省略的则为默认的name 
    * nullable = false表示是否此列容许空值
    * length=32表示长度
    
*/

     @Column(name 
= "PersonName",nullable=false,length=32)
    
private String name;    
    
private boolean sex;
    
private Short age;
    
private Date birthday;
    
private IDCard idcard;
  
    @Id
    @GeneratedValue(strategy 
= GenerationType.AUTO) //(strategy = GenerationType.AUTO) 默认的,可以省略
    public Integer getPersonid() {
        
return personid;
    }

    
public void setPersonid(Integer personid) {
        
this.personid = personid;
    }
 
    
   
    
public String getName() {
        
return name;
    }

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

    
    @Column(nullable
=false)
    
public boolean getSex() {
        
return sex;
    }

    
public void setSex(boolean sex) {
        
this.sex = sex;
    }

    
    @Column(nullable
=false)   
    
public Short getAge() {
        
return age;
    }

    
public void setAge(Short age) {
        
this.age = age;
    }
 
    
// @Temporal 表示对于时间的注释,因为有不同的时间格式表示方式
    
//@Temporal可以不用,系统将采取默认一种
    @Temporal(value=TemporalType.DATE)
    
public Date getBirthday() {
        
return birthday;
    }

    
public void setBirthday(Date birthday) {
        
this.birthday = birthday;
    }

    
/**
    * @OneToOne
    * mappedBy = "person"  定义类之间双向关系,如果类之间是单向关系则不需要提供定义,若类与类之间有双向关系则一定钥匙此注释,否则造成数据不一致
    * cascade 级联关系
    * optional = true表示idcard属性可以null
    * fetch 有FetchType.EAGER和FetchType.LAZY前者为主类加载同时加载,后者是表示关系类在被访问时才加载
    
*/

    @OneToOne(optional 
= true,cascade = CascadeType.ALL, mappedBy = "person")   
    
public IDCard getIdcard() {
        
return idcard;   
    }
   
    
public void setIdcard(IDCard idcard) {  
        
this.idcard = idcard;   
    }
 
        
}