JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中实现数据持久化。同时,它还是JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构。而Hibernate 从3.2开始,就开始兼容JPA,也就是说,除了通过配置xml实现实体关系映射,创建数据库表结构,还有一种更简易的办法,那就是使用注解。
搭建利用注解进行实体映射的环境,就是在普通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; }
@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框架的整合,在项目的各个地方均可使用注解达到简化代码的作用,符合标准所以处处适用,简单易集成。