一、JPA:

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中实现数据持久化。同时,它还是JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构。而Hibernate 从3.2开始,就开始兼容JPA,也就是说,除了通过配置xml实现实体关系映射,创建数据库表结构,还有一种更简易的办法,那就是使用注解。

二、搭建hibernate annotation 环境:

     搭建利用注解进行实体映射的环境,就是在普通hibernate应用中,多引入有关annotation的jar包即可。所以首先还是引入jar,然后配置hibernate.cfg,xml文件,将使用注解的实体路径通过<mapping class=””>配至到xml文件中。具体jar包如下:

       * HIBERNATE_HOME/lib/*.jar       --hibernate home lib下所有jar包

       * HIBERNATE_HOME/hibernate3.jar  --hibernate核心jar

       * 加入数据库驱动(mysql驱动)

       * hibernate-annotations.jar      --3个hibernate annotation支持包

       * ejb3-persistence.jar

       * hibernate-commons-annotations.jar

三、实体关联关系通过注解的实现:

1、1:n  hibernate JPA一对多关联映射



@Entity  //该实体利用注解进行映射
@Table(name="t_student")  //指定实体对应的数据库名称
public class Student {
	private int id;	
	private Classes classes;
	
	@Id  //get方法指定主键	
	@GeneratedValue   //相当于@GeneratedValue(strategy=GenerationType.AUTO)id生成策略相当于hibernate中的native  
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@ManyToOne           //多的一端加入关联关键 ,
	@JoinColumn(name="classesid")
	public Classes getClasses() {
		return classes;
	}
	public void setClasses(Classes classes) {
		this.classes = classes;
	}
}


//1端:
@Entity
@Table(name="t_classes")
public class Classes {
	
	private int id;	
	private Set students;

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

	public void setId(int id) {
		this.id = id;
	}
	//mappedBy在哪一端,哪一端就不维护关系,它成为了关系的被管理端
	//向当于hibernate中的inverse=true
	//如果采用了泛型,可以不用采用targetEntity属性
	@OneToMany(mappedBy="classes",targetEntity=Student.class)
	@JoinColumn(name="classesid") //关联外键的名称==students 端外键名方可进行关联
	public Set getStudents() {
		return students;
	}

	public void setStudents(Set students) {
		this.students = students;
	}



2、 n:1  hibernate JPA多对一关联映射




@Entity
@Table(name="t_user")
public class User {

	private int id;
	private Group group;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	@ManyToOne   //多的一端采用manytoOne ,<span style="font-family:微软雅黑;">JPA会采用关联对象+"_" + "id"方式作为字段加入表中,故会在t_student表加入group_id负责关联</span>
	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}
}

@Entity
@Table(name="t_group")
public class Group {
	private int id;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}

3、n:n hibernate jpa 多对多关联映射


@Entity
@Table(name="t_user")
public class User {	
	private int id;	
	private Set<Role> roles;
	
	@Id @GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	//因为集合使用泛型所以不再使用targetEntity来指定类型
	@ManyToMany 
	@JoinTable( //采用@JoinTable指定第三方表的名称
			name="t_user_role",
			joinColumns={@JoinColumn(name="user_id")},
			inverseJoinColumns={@JoinColumn(name="role_id")}
	)
	public Set<Role> getRoles() {
		return roles;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}

@Entity
@Table(name="t_role")
public class Role {
	private int id;		
	private Set<User> users;
	
	@Id @GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@ManyToMany(mappedBy="roles")  //mappedBy通过对方(User对象)来管理关联关系
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
}


4、 继承—— 三个创建表机制--三种注解方法

 1、单表继承——子类生成两张表,利用鉴别字段 鉴别子类




@Entity
@Table(name="t_animal")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
public class Animal {
	private int id;	
	private String name;
	private boolean sex;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	//省略get set 方法
}

@Entity
@DiscriminatorValue(value="B")
public class Bird extends Animal {
	private int height;
	//省略get set 方法
}

@Entity
@DiscriminatorValue(value="P")
public class Pig extends Animal {
	private int weight;
	//省略get set 方法 
}

2、具体表继承:共生成三张表,animal为公用属性表,bird 和pig 表存储各自特殊属性。

@Entity
@Table(name="t_animal")
@Inheritance(strategy=InheritanceType.JOINED)
public class Animal {
	private int id;	
	private String name;	
	private boolean sex;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
//省略get set 
}

@Entity
public class Bird extends Animal {
	private int height;
	//省略get set 
}

@Entity
public class Pig extends Animal {

	private int weight;
	//省略get set
}

3、类表继承:两张子类表,存储各自所有属性字段

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Animal {
	private int id;	
	private String name;	
	private boolean sex;
	@Id
	public int getId() {
		return id;
	}
	//省略get set
}

@Entity
public class Bird extends Animal {
	private int height;
}

@Entity
public class Pig extends Animal {
	private int weight;
	//省略get set
}

通过使用注解,取代了每个实体配置xml,使用标签创建关联,很大程度上减少了编码的数量,使得配置实体映射方便简洁,同时,注解的使用不仅体现在实体映射的创建,同时还体现在junit测试、SSH框架的整合,在项目的各个地方均可使用注解达到简化代码的作用,符合标准所以处处适用,简单易集成。