jpa介绍
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。它是一组规范(接口),目前Hibernate [1]3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。类似于jdbc也是一组规范,实现则是由MySql,Oracle,SqlServer等数据库厂商来提供,这样就只需要面向提供的接口来进行编程,而不需要关系具体实现。
第一个jpa程序
1、使用eclipse创建jpa程序
版本要选择2.0,默认的2.1是缺少jar包的。
如果先前没有创建过jpa程序,这里是需要下载EclipseLink的,点击右方的下载图标选择版本就行。
2、导入jar包
3、修改persistence.xml文件
需要选择数据库,选择的orm框架的基本信息(这里选择的是hibernate)。
Connection视图下选择连接数据库
Source视图下配置orm框架的基本信息
4、实体类
@Entity
@Table(name = "t_user")
public class User {
@Id//必须指定主键
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="user_name")
private String userName;
private String password;
private String telephone;
private String email;
//映射必须定义个空构造器
public User() {
}
public User(String userName, String password, String telephone, String email) {
this.userName = userName;
this.password = password;
this.telephone = telephone;
this.email = email;
}
get、set、toString方法
}
jpa的关键就在这个实体类,通过一系列注解就能将该实体类映射到数据库中,注解解释在后。
5、将实体类注册到配置文件
在persistence.xml文件中列出该实体类,需要注意列出的位置顺序。
<class>com.scu.jpa.entity.User</class>
6、测试数据持久化到数据库
- 创建EntityManager工厂
- 创建EntityManager
- 获取事务,开启事务
- 执行持久化操作
- 提交事务
- 关闭EntityManager
public void testPersistence(){
//创建EntityManagerFactory,需要指定持久化单元name,在persistence.xml中,默认即项目名称
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("jpa-2");
//创建EntityManager
EntityManager entityManager = managerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
//开始事务
transaction.begin();
User user = new User("Tom", "123456", "13822222228", "tom@qq.com");
//持久化操作
entityManager.persist(user);
//提交事务
transaction.commit();
entityManager.close();
}
执行测试,数据库查看,多出了t_user表,以及插入的数据
注解解释
- Entity:该注解用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表;
- Table:用来指定该实体类映射到数据库哪张表,name属性用来指定表名,比如上面的例子,映射的表名是”t_user”,默认是与实体类名称一致;
- Id:顾名思义@Id用来指定主键,数据库表必须有主键,所以这里必须指定不然编译都不能通过;
- @GeneratedValue:指定主键生成策略,可以通过属性strategy来指定,共有如下4种(Table不介绍)
1、IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
2、AUTO: JPA自动选择合适的策略,是默认选项;
3、SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式; - Column:用来表示该字段映射到数据库中的字段名,除了name属性指定字段名外,还可以指定长度,不为null,unique等;
- Basic:不写@Column注解的话默认是使用@Basic注解,属性名和字段名此时是相同的。
- Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic;
- Temporal:在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备). 在进行属性映射时可使用@Temporal注解来调整精度。
注:这些注解可以添加到属性上也可以添加到get方法上。
测试@Transient,@Temporal
比如要对@Transient,@Temporal做测试
在上面的User实体类中添加个属性,创建时间(create_date),修改构造方法,添加工具方法。
@Entity
@Table(name = "t_user")
public class User {
@Id//必须指定主键
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="user_name")
private String userName;
private String password;
private String telephone;
private String email;
@Column(name="create_time")
@Temporal(TemporalType.DATE)
private Date createTime;
//映射必须定义个空构造器
public User() {
}
public User(String userName, String password, String telephone, String email, Date createTime) {
super();
this.userName = userName;
this.password = password;
this.telephone = telephone;
this.email = email;
this.createTime = createTime;
}
public String getUserInfo(){
return "username:"+this.userName+",email:"+this.email;
}
get,set,toString方法
}
删除数据库的t_user表,重新测试持久化实体
public void test1(){
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("jpa-2");
EntityManager entityManager = managerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
//开始事务
transaction.begin();
//持久化操作
User user = new User("Tom", "123456", "13822222228", "tom@qq.com",new Date());
entityManager.persist(user);
transaction.commit();
entityManager.close();
}
查看数据库t_user表,添加了创建日期字段,且只显示日期,同时能看到并没有添加UserInfo字段