首先看下使用JPA规范的注解方式模板(代码中解释很详细):
@Entity(name="person")
public class Person {
//GenerationType为AUTO是权衡mysql和oracle不同,也可以对应具体数据库选择IDENTITY或者SEQUENCE
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
//不能为空就设为false
@Column(length=10,nullable=false,name="pname")
private String name;
//时间类型
@Temporal(TemporalType.DATE)
private Date birthday;
//枚举型举例,EnumType.ORDINAL是将索引值存入数据库
//@Enumerated枚举类型的性别(必须加上非空约束),设置默认值
@Enumerated(EnumType.STRING) @Column(length=5,nullable=false)
private Gender gender = Gender.MAN;
//存储大文本,二进制数据,数据库字段格式longblob @Lob用于二进制数据 @Basic(fetch=LAZY)延迟初始化该属性,一般用于大数据(超过1M)
//basic注解作用类似hibernate延迟加载(LAZY),在person没有getFile时不加载此字段,
//因为其容量太大,占用内存太大,同时,如果在关闭session后getFile也会报懒加载异常
@Lob @Basic(fetch=FetchType.LAZY)
private Byte[] file;
//数据库字段类型为longtext @Lob大文本类型
@Lob
private String info;
//这个注解是不在数据库中映射这个字段 @Transient不持久化这个属性
@Transient
private String imagePath;
<!-- 相应的get set方法省略 -->
}
对于数据库的基本操作方法模板:
private static EntityManagerFactory factory;
private static EntityManager em;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
factory = Persistence.createEntityManagerFactory("jpatest1");
em = factory.createEntityManager();
}
@Test
public void savePerson() {
em.getTransaction().begin(); //开启事务
em.persist(new Person("张三")); //持久化对象(相当于Hibernate的save/persist方法)
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void getPerson1() {
//find() : 根据id得到某个Person对象。相当于Hibernate的get()方法,即时加载
//如果要找的数据不存在,返回null值
Person person = em.find(Person.class, 1);
System.out.println(person.getName());
//重新刷新数据库中的数据,防止数据被别人修改过
em.refresh(person);
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void getPerson2() {
//getReference() : 根据id得到某个Person对象.相当于Hibernate的load()方法,延迟加载
//如果数据不存在,报错
Person person = em.getReference(Person.class, 1);
//如果不调用这句代码,不会从数据库加载数据
System.out.println(person.getName());
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void updatePerson1() {
em.getTransaction().begin(); //开启事务
Person person = em.find(Person.class, 1);
//条件:1.关联事务
// 2.对象处于托管(managed)状态。 JPA一共四种状态:初始状态 , 托管状态, 游离状态, 删除状态
person.setName("李四"); //可以修改到数据库
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void updatePerson2() {
em.getTransaction().begin(); //开启事务
Person person = em.find(Person.class, 1);
//将实体管理器中的所有实体变成游离状态
em.clear();
//游离状态的数据不能持久化到数据库
person.setName("王五");
//把游离态的更新同步回数据库
em.merge(person);
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void deletePerson1() {
em.getTransaction().begin(); //开启事务
Person person = em.find(Person.class, 1);
//删除某个实体
em.remove(person);
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
//这里注意jpql操作的数据库名和字段名是类名字,不是自定义到数据库的名字,这就是面向对象的思想
@Test
public void jpqlQuery() {
Query query = em.createQuery("select o from person o where o.id = ?1");
query.setParameter(1, 1);
// query.getResultList(); //等同于Hibernate的list()方法
Person person = (Person)query.getSingleResult();
System.out.println(person.getName());
// Query query2 = em.createQuery("select count(0) from Person o");
// query2.getSingleResult(); //等同于Hibernate的uniqueResult()方法
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void deleteQuery() {
em.getTransaction().begin(); //开启事务
Query query = em.createQuery("delete from person o where o.id = ?1");
query.setParameter(1, 2);
//删除的更新方法,没有它立即刷新看不到数据删除
query.executeUpdate();
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
@Test
public void updateQuery() {
em.getTransaction().begin(); //开启事务
Query query = em.createQuery("update person o set o.name=:name where o.id = ?1");
query.setParameter("name", "赵六");
query.setParameter(1, 1);
//删除的更新方法
query.executeUpdate();
em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
最后再次附上META-INF目录下的persistence.xml文件配置:
<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">
<!-- 持久化单元名字name=jpatest1,这个和前面createEntitymanagerFactory名字一致 -->
<persistence-unit name="jpatest1" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
JPA开发最基本的操作配置信息就全了,下一步就是对一对多,一对一,多对多的配置作介绍。