hibernate annotation 之 一对一单向外键关联(一)

2014-11-24 09:46:34 · 作者: · 浏览: 3

一对一关联有三种情况:

一是关联的实体都共享同样的主键,二是其中一个实体通过外键关联到另一个实体的主键 ,三是通过关联表来保存两个实体之间的连接关系。

接下来要介绍的是,注解形式的一对一单向外键关联的情况。

环境 : JDK 1.6,eclipse 3.6,maven 3.0.4,hibernate 3.3.2,junit 4.7,mysql 5.1

pom.xml 核心部分清单

org.hibernate

hibernate-core

3.3.2.GA

cglib

cglib

2.2

javassist

javassist

3.9.0.GA

org.hibernate

hibernate-annotations

3.4.0.GA

org.slf4j

slf4j-log4j12

1.5.8


mysql

mysql-connector-java

5.1.17


junit

junit

4.7

test

注 : 此处配置 pom.xml 是使用 maven 来管理 jar 包,如果你没有使用 maven,则需手动导入相关 jar 包。


实体 bean

package net.yeah.fancydeepin.unidirectional.po;


import java.io.Serializable;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToOne;

import org.hibernate.annotations.GenericGenerator;

@Entity

public class Student implements Serializable{


private static final long serialVersionUID = 1L;

private String id;
private String name;
private StudentCard studentCard;

@Id

@GenericGenerator(name = "idGenerator", strategy = "uuid")

@GeneratedValue(generator = "idGenerator")

@Column(length = 32)

public String getId() {

return id;

}

@Column(length = 18, nullable = false)

public String getName() {

return name;

}


@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)

public StudentCard getStudentCard() {

return studentCard;

}


public void setId(String id) {

this.id = id;

}


public void setName(String name) {

this.name = name;

}


public void setStudentCard(StudentCard studentCard) {

this.studentCard = studentCard;

}


}


@OneToOne 建立实体 bean 之间的一对一的关联

cascade 级联策略,即,当对主对象做某种操作时,是否对其相关联的子对象也做相对应的操作。它有5个值可选,分别是 :

CascadeType.PERSIST : 级联新建

CascadeType.REMOVE : 级联删除

CascadeType.REFRESH : 级联刷新

CascadeType.MERGE : 级联更新

CascadeType.ALL : 囊括以上四项

fetch 抓取策略,它有2个值可选,分别是 :

FetchType.LAZY : 延迟抓取

FetchType.EAGER : 立即抓取

Tips : 延迟抓取数据能够保证应用只有在需要的时候才去数据库抓取相应的数据记录,这样能够避免过多,

或过早的加载数据库表中的数据,从而减少应用内存的开销。

@JoinColumn 该注解与@Column 注解用法有点相似,可以通过name来指定联接列的名称,如果没有该注解没有被声明,

默认的联接列名称是 : 关联的类的短类名(首字母小写,不带包名)_id。


实体 bean

package net.yeah.fancydeepin.unidirectional.po;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;


@Entity

public class StudentCard implements Serializable{


private static final long serialVersionUID = 1L;


private Long id;

private Date date;


@Id

public Long getId() {

return id;

}


@Column(nullable = false)

@Temporal(TemporalType.DATE)

public Date getDate() {

return date;

}


public void setId(Long id) {

this.id