JPA简单知识
,JPA(Java Persistence API):通过注解或XML描述对象--关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的技术:
- ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
- Java持久化API:用来操作实体对象,执行CRUD操作
- 查询语言:JPQL。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
@Entity用来标注实体
@Table用来指定实体对应的表名
@Id用来标注实体的标示,即主键。@GeneratedValue用来标注主键的生成方式。主要有以下几种:
* GenerationType.AUTO---由ORM产品根据数据库方言决定--AUTO是默认值,可以省略,即@Id @GeneratedValue
* GenerationType.IDENTITY---常用于Mysql、Sqlserver
* GenerationType.SEQUENCE---常用于Oracle
* GenerationType.TABLE--通用,但是效率不高
@Column标注实体的属性,对应数据库表中的字段,包括length,name,nullable等设置
@Temporal标注时间类型的属性,@Temporal(TemporalType.DATE),@Temporal(TemporalType.TIME),@Temporal(TemporalType.TIMESTAMP)
@Enumerated标注索引,包括@Enumerated(EnumType.ORDINAL)//保存枚举的索引值,@Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)
@Lob //对应数据库大文本字段,还可以保存文件
@Transient //表示不与数据库映射
实例说明:
package com.yl.demo1.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.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient; @Entity
@Table(name="t_person") public class Person { private Integer id;
private String name;
private Date birthday;//日期类型
private Sex sex = Sex.MAN;//枚举类型,并设置默认值
private String info;
private String notinvoke;//不希望映射到数据库的字段
private Byte[] bigfile; public Person(){} public Person(String name) {
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false, name="personName")
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 Sex getSex() {
return sex;
} public void setSex(Sex sex) {
this.sex = sex;
}
@Lob //对应数据库大文本字段,还可以保存文件
public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} @Transient //表示不与数据库映射
public String getNotinvoke() {
return notinvoke;
} public void setNotinvoke(String notinvoke) {
this.notinvoke = notinvoke;
}
/***
* FetchType.EAGER---立即加载
* FetchType.LAZY----延迟加载,没有访问get方法时不会加载
*/
@Lob @Basic(fetch=FetchType.EAGER)
public Byte[] getBigfile() {
return bigfile;
} public void setBigfile(Byte[] bigfile) {
this.bigfile = bigfile;
} }
上面类中用到的枚举
public enum Sex {
MAN, WOMAN
}
对实体的各种操作行为,包括保存,查询,更新,删除等。
@Test public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person p = new Person("老子");
em.persist(p);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void getPerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);//相当于hibernate的get方法
/**
* 这里执行了一个占时较长的任务时,其他部分可能修改了数据库中的对象,如果下面想要继续使用这个对象,可以使用refresh方法获取最新的数据
*此时调用查询方法只能是在EntityManager的一级缓存中获取刚才查询到的数据,无法获取最新的数据
*/
em.refresh(person);
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void getPerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 1);//相当于hibernate的load方法,延迟加载
System.out.println(person.getName());
em.close();
//System.out.println(person.getName());//获取出错
factory.close();
}
/**实体的状态
* new
* 托管
* 游离
* 删除
*
*/
@Test public void updatePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
person.setName("孔子");
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void updatePerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);
em.clear();//把实体管理器中的所有实体变成游离状态
person.setName("lao jia");
em.merge(person);//把游离状态的实体同步到实体管理器
em.close();
//person.getName();//此时无法查询到数据
factory.close();
}
@Test public void deletePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void query() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Query query = em.createQuery("select o from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
Person person = (Person) query.getSingleResult();
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void deleteQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("delete from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void updateQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("update Person o set o.name = :name and o.id = :id");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
JPA简单知识的更多相关文章
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
- 关于trunk、access以及hybrid的一些简单知识
关于trunk.access以及hybrid的一些简单知识:Access 类型的端口只能属于 1 个 VLAN ,一般用于连接计算机的端口: Trunk 类型的端口可以允许多个 VLAN 通过,可以接 ...
- svn的简单知识
svn的简单知识 一.简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统, 它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...
- JavaScript学习笔记(一):介绍JavaScript的一些简单知识
JavaScript是世界上最流行的编程语言.这门语言可用于HTML和web,更可广泛用于服务器.PC.笔记本电脑和智能手机等设备.---------------------------------- ...
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- JAVA入门[20]-Spring Data JPA简单示例
Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...
- Spring Data Jpa简单了解
原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...
- springboot整合JPA(简单整理,待续---)
整合步骤 引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</group ...
- JPA 简单实体映射和EntityManagerAPI
[常用注解] 使用JPA 指定映射关系时,有两种方式,一种是使用xml 方式,另一种是注解方式,笔者推荐使用注解方式.在JPA 映射简单实体时,常用的注解如下: @Entity:修饰实体类对象,表示该 ...
随机推荐
- Google code: Why ‘Everything up-to-date’ when pushing (git)
原文链接:http://blog.rexzhao.com/2011/11/28/google-code-git-everything-up-to-date-when-push.html 第一次在Goo ...
- iOS 基础 第三天(0807)
0807 成员变量作用域###### 如下图所示: 这里要注意手写的成员变量/实例变量默认的作用域是private,所以外部指针类型的对象无法直接访问,这起到一定的保护作用.但可以在当前类内部@imp ...
- 【BZOJ3262】 陌上花开
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- drupal CMS
http://drupalchina.cn/ https://www.drupal.org
- Matlab划分测试集和训练集
% x是原数据集,分出训练样本和测试样本 [ndata, D] = size(X); %ndata样本数,D维数 R = randperm(ndata); %1到n这些数随机打乱得到的一个随机数字序列 ...
- PAT-乙级-1011. A+B和C (15)
1011. A+B和C (15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 给定区间[-231, 231 ...
- "Principles of Reactive Programming" 之 <Persistent Actor State>学习笔记
这是<Pinciples of Reactive Programming>week6的最后一课. 为什么需要把actor的状态持久化? 如果actor没有状态,那么在任何实时,这个acto ...
- Samza在YARN上的启动过程 =》 之二 submitApplication
首先,来看怎么构造一个org.apache.hadoop.yarn.client.api.YarnClient class ClientHelper(conf: Configuration) exte ...
- Android 环境搭建 版本问题
jdk1.6 1.7 eclipse 3.7.2 SDK-r12 ADT 12 SDK和ADT必须配套 搭建环境需要四个软件: 1.JDK(这是最新版本jdk1.7官方下载地址:http:// ...
- 【网络】IP地址分配、端口号、分层
3.网络分层 OSI的七层网络结构图和TCP/IP的五层结构图 OSI七层模型OSI中的层 功能 ...