JPA,一套相当优秀的持久化规范,开始体验。
1、我使用Hibernate对JPA提供的实现,下载hibernate-release-4.1.1.Final.zip。解压。
在hibernate-release-4.1.1.Final\lib目录下有四个存放jar包的目录,其中
hibernate-release-4.1.1.Final\lib\jpa 存放hibernate对JPA提供实现的jar
hibernate-release-4.1.1.Final\lib\required 存放hibernate核心jar以及依赖的jar
这两个目录下的所有jar是我们体验JPA所必需的。
2、新建一个Java Project。
2.1 导入hibernate-release-4.1.1.Final\lib\jpa目录和hibernate-release-4.1.1.Final\lib\required目录下的所有jar;导入mysql的数据库驱动包。
2.2 在项目的classpath路径下建立META-INF目录
在META-INF目录下建立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"> <!-- 为持久化单元取名为 myJPA --> <persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL"> <properties> <!--配置Hibernate方言 --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> <!--配置数据库驱动 --> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> <!--配置数据库用户名 --> <property name="hibernate.connection.username" value="root" /> <!--配置数据库密码 --> <property name="hibernate.connection.password" value="root" /> <!--配置数据库url --> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" /> <!--设置外连接抓取树的最大深度 --> <property name="hibernate.max_fetch_depth" value="3" /> <!--自动输出schema创建DDL语句 --> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
用的是mysql,请建立一个名叫jpa的数据库:create database jpa default character set utf8;
无需手动建表,执行测试的时候会自动建表。
3、项目视图如下:
4、编写实体类。
package com.cndatacom.jpa.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_user") public class User { /** * 主键 */ @Id @GeneratedValue private Long id; /** * 名字 */ @Column(name="name") private String name; /** * 密码 */ @Column(name="password") private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
5、编写测试类。
package com.cndatacom.jpa.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.cndatacom.jpa.entity.User; public class TestJPA { EntityManagerFactory emf = null; @Before public void before() { //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPA"); } /** * 添加用户 */ @Test public void addUser() { //创建一个用户 User user = new User(); user.setName("叶开"); user.setPassword("yekai"); //创建实体管理器对象 EntityManager em = emf.createEntityManager(); //开启事务 em.getTransaction().begin(); //持久化对象 em.persist(user); //提交事务 em.getTransaction().commit(); //关闭EntityManager em.close(); } /** * 修改用户(用户处于托管状态) */ @Test public void modifyUser1() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //查找id为1的User,进行更新 User user = em.find(User.class, 1L);//User 的主键id为Long型 user.setName("楚留香"); em.getTransaction().commit(); em.close(); } /** * 修改用户(用户处于游离(脱管)状态) */ @Test public void modifyUser2() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //查找id为1的User,进行更新 User user = em.find(User.class, 1L);//User 的主键id为Long型 em.clear();//将实体管理器中的所有实体变成了游离态(脱管) user.setName("李寻欢"); em.merge(user);//处于游离态的实体必须使用该方法才能更新 em.getTransaction().commit(); em.close(); } /** * 删除用户 */ @Test public void deleteUser() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //查找id为1的User User user = em.find(User.class, 1L);//User 的主键id为Long型 //进行删除 em.remove(user); em.getTransaction().commit(); em.close(); } /** * 关闭EntityManagerFactory */ @After public void after() { if(null != emf) { emf.close(); } } }
6、一些说明。
@Entity 将领域标注为一个实体,表示要保存到数据库中。
@Table 指定在数据库中对应的表名
@Id 对应的属性是表的主键
@GeneratedValue 主键的产生策略,这里表示使用默认的GenerationType.AUTO
@Column 属性对应数据库表中的列,name指定列名,不写name的话,属性名和列名一致。