1.依赖jar包:
2.配置文件:
<?xml version="1.0" encoding="UTF-8"?> <persistence 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_1_0.xsd" version="1.0"> <persistence-unit name="HelloJPAPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver"/> <property name = "hibernate.connection.url" value = "jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8"/> <property name = "hibernate.connection.username" value = "root"/> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
3.定义实体bean:
import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity public class Person { private Integer id; private String name; private Date birthday;//1988-02-01 private Gender gender=Gender.MAN; private String info; private Byte[] file; private String imagePathString; public Person(){ } public Person(String name){ this.name=name; } @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length=10,nullable=false) public String getName() { return name; } public void setName(String name) { this.name = name; } @Temporal(TemporalType.DATE) public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Enumerated(EnumType.STRING)//将索引值保存进数据库 @Column(length=5,nullable=false) //设置长度 public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } @Lob //大数据字段的说明,用在String上面是个大文本类型 public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } @Lob //大数据字段说明,用在这里是存放二进制数据的类型 @Basic(fetch=FetchType.LAZY)//延迟加载,当访问此属性的get方法时才会从数据库加载到内存, //此时必须保证em处于打开状态,否则会有延迟加载错误。 public Byte[] getFile() { return file; } public void setFile(Byte[] file) { this.file = file; } public void setImagePathString(String imagePathString) { this.imagePathString = imagePathString; } @Transient //此属性不成为持久化字段 public String getImagePathString() { return imagePathString; } }
枚举类:
package com.persia.jpa; public enum Gender { MAN,WOMAN }
4.添加测试方法:
package junit.test; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.BeforeClass; import org.junit.Test; import com.persia.jpa.Person; public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } //@Test public void save(){ EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); //此时数据库表已经建立,若没有表,很可能是实体的注解出错了。 EntityManager em=fac.createEntityManager(); em.getTransaction().begin();//开启事务 Person person=new Person("linda"); person.setBirthday(new Date()); em.persist(person); em.getTransaction().commit();//提交事务 em.close(); fac.close(); } //@Test public void getPerson(){ //读取不用开启事务 EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); EntityManager em=fac.createEntityManager(); Person p=em.find(Person.class, 1);//不存在返回null System.out.println(p.getName()); em.close(); fac.close(); } //@Test public void getPerson2(){ //读取不用开启事务 EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); EntityManager em=fac.createEntityManager(); Person p=em.getReference(Person.class, 2);//延迟初始化,不会立刻从数据库得到记录,只是得到一个代理对象 System.out.println(p.getName()); //当我们访问这个代理对象的属性时,才从数据库得到记录,此时必须保证em是开着的,否则出现延迟加载例外。 //此时若访问时,不存在该实体则抛出例外EntityNotFoundException em.close(); fac.close(); } //@Test public void updatePerson(){ EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); EntityManager em=fac.createEntityManager(); em.getTransaction().begin();//开启事务 Person p=em.find(Person.class, 1); p.setName("helloworld");//此时可以更新,主要有如下: /** * 1.跟当前事务关联 * 2.实体bean的状态为托管状态 * * 实体的状态: * 1.新建 new * 2.托管 managed * 3.游离(脱管) * 4.删除 */ em.getTransaction().commit();//提交事务 em.close(); fac.close(); } //@Test public void updatePerson2(){ EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); EntityManager em=fac.createEntityManager(); em.getTransaction().begin();//开启事务 Person p=em.find(Person.class, 1); em.clear();//把实体管理器中的所有实体变成游离状态,此时应该用merge来更新 p.setName("hello3");//此时可以更新,主要有如下: em.merge(p);//用于把对处于游离状态的实体bean的更新同步到数据库。 em.getTransaction().commit();//提交事务 em.close(); fac.close(); } @Test public void delete(){ EntityManagerFactory fac=Persistence.createEntityManagerFactory("HelloJPAPU"); EntityManager em=fac.createEntityManager(); em.getTransaction().begin();//开启事务 Person p=em.find(Person.class, 1); em.remove(p);//删除托管状态的实体bean em.getTransaction().commit();//提交事务 em.close(); fac.close(); } }