1、创建一个项目,
可以使用eclipse直接创建JPA project,也可以创建java项目,然后手动添加persistence.xml文件,(首先在src下创建META-INF文件夹,然后创建persistence.xml)。
persistence.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
<!--
配置用什么ORM框架
1. 实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类
2. 如果JPA项目中只有一个JPA的实现产品,则可以不配置该节点
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- 添加持久化类 -->
<class>com.atguigu.jpa.bean.User</class>
<properties>
<!-- 配置数据源信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///hibernate1"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<!-- 配置JPA实现产品的属性,即hibernate的属性 -->
<property name="hibernate.format_sql" value="true"/><!-- 是否格式化sql语句 -->
<property name="hibernate.show_sql" value="true"/> <!-- 是否在控制台打印sql语句 -->
<!-- 生成数据表的策略,有就更新,没有就创建 -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
注意:在最开始因为导入的jar包版本的问题,报了错误,显示jar包版本不支持2.0,所以删除了一部分jar包,又重新导入了jar包,但是后来又加入与时间相关的属性,再进行重新创建表时,没有报错,但是也创建出时间属性相关的列,解决办法如下:
不报错的jar包版本
2、创建持久化类
package com.atguigu.jpa.bean;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Table(name="tb_user") //为数据库表命名,如果不加,自动为类名
@Entity //将类标记为实体类,对应数据库的表
public class User {
private Integer userId;
private String userName;
private String password;
private String email;
private Date createTime;
private Date birth;
//映射数据表字段的名字,还可以指定长度等等
//如果不写,则是默认长度
@Column(name="user_id",length=50)
//生成主键的策略
@GeneratedValue(strategy=GenerationType.AUTO)
@Id //映射主键,加到get方法上
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name="user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Basic //默认get方法上是加了该注解的,把属性映射到表字段
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//创建时间应该精确到秒,不加默认是精确到秒
//下面这个属性值代表精确到秒,时间戳
@Temporal(TemporalType.TIMESTAMP)
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
//生日应该精确到时间,即年月日
@Temporal(TemporalType.DATE)
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
//这是一个工具的方法,不需要映射到数据库表中,
//这时使用@Transient,表示忽略该属性,不进行映射
@Transient
public String getInfo(){
return "userName="+userName+"email"+email;
}
}
3、将持久化类配置到persistence.xml文件中
<!-- 添加持久化类 -->
<class>com.atguigu.jpa.bean.User</class>
4、测试使用
//1.创建EntityManagerFactory
//2.创建EntityManager
//3.开启事务
//4.进行持久化操作
//5.提交事务
//6.关闭EntityManager
//7.关闭EntityManagerFactory
//下面persistenceUnitName的值为persistence.xml文件中的下面标签内name的值
/*<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">*/
String persistenceUnitName="jpa";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction tx= entityManager.getTransaction();
tx.begin();
User user = new User();
user.setUserName("源稚生");
user.setPassword("123456");
user.setEmail("sakura@qq.com");
//进行保存
entityManager.persist(user);
tx.commit();
entityManager.close();
entityManagerFactory.close();
详细知识点:主键生成策略(用table生成主键)
将当前主键的值单独保存到数据库的一个表中,主键的值每次都从表中查询来获得,这种方法生成的主键策略适用于每一个数据库,不用担心不兼容问题。
首先在数据库建立一个表
在持久化类上进行如下设置
//生成主键的策略
//name指定生成器,table指定使用哪个表
//pkColumnName和pkColumnValue确定一行
//valueColumnName确定一列,然后一行一列确定一点
//allocationSize主键每次增加100
@TableGenerator(name="ID_GENERATOR",
table="jpa_id_generator",
pkColumnName="PK_NAME",
pkColumnValue="USER_ID",
valueColumnName="PK_VALUE",
allocationSize=100
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR") //generator是生成器
@Id //映射主键,加到get方法上
public Integer getUserId() {
return userId;
}