JPA:
JPA(Java持久层API):
Java Persistence API
由Java开发的持久化的标准,需要provider来实现其功能,Hbernate就是JPA Provider中很强的一个
Hibernate时JPA标准的一个实现,还在此基础上增加了一些自己特有的功能(JPA是hibernate的一个子集的说法)
如JDBC是Java数据库的通用API,每种数据库自己提供自己的实现
如self4j是一种通用的日志API,用户选择不同的实现
那么JPA是Java数据持久化的一个通用API,底层可以选择Hibernate,也可以选择TPLink等
易百教程:http://www.yiibai.com/jpa/jpa_architecture.html
Hibernate如何实现JPA:
Hibernate主要通过三个组件来实现:
hibernate-annotation:
是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation
hibernate-core:
是Hibernate的核心实现,提供了Hibernate所有的核心功能
hibernate-entitymanager:
实现了标准的API,可以看作hibernate-core和JPA之间的适配器
它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范
pojo:
在Hibernate JPA中,不需要创建JavaBean.hbm.xml文件,可以使用javax.persistence注解代替
//相当于创建了Customer.hbm.xml @Entity @Table(name="t_customer1") public class Customer { @Id //主键生成策略 @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="c_id") private Integer id; @Column(name="c_name") private String name; @Column(name="c_gender") private Character gender; //数据库忽略此属性 @Transient private Integer age; @Column(name="c_level") private String level;
}
hibernate.cfg.xml:
<!-- mapping文件 -->
<mapping class="com.roxy.hibernate.pojo.Customer"/>
Test:
@Test public void testJPA(){ Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); Customer c = new Customer(); c.setName("hormoine"); session.save(c); tx.commit(); session.close(); }
Hibernate主键生成策略和JPA主键生成策略对比:
hibernate内置了很多主键生成策略,这些策略可以分为两类:JPA标准的主键生成策略和Hibernate框架特有的主键生成策略
Hibernate:
Identity:提供对自增主键的支持(mysql、sqlserver)
sequence:利用数据库的序列生成的能力生成主键字段(oracle)
native:本地策略,由hibernate自动根据不同的数据库选择
uuid:生成32位的16进制字符串走位主键
increment:生成递进的数值类型(+1)
assigned:由开发者明确赋值
JPA:
@GeneratedValue(strategy=GenerationType.IDENTITY)
提供对自增主键的支持,对应hibernate的identity
@GeneratedValue(strategy=GenerationType.AUTO)
是JPA默认的策略
将主键生成的策略交给持久化引擎(persistence engine)来决定,从table策略、sequence策略、identity策略中选择最合适的
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="mySeqGenerator")
@SequenceGenerator(name = "mySeqGenerator",
sequenceName = "t_customer2_sequence",
initialValue = 1000, allocationSize = 50)
使用数据库内置的序列生成器,对应hibernate的sequence策略
可以配合使用@SequenceGenerator,用来指定序列的相关信息
name:序列生成器的名称,会在@GeneratedValue中进行引用
sequenceName:oracle数据库中的序列生成器名称
initialValue:主键的初始值
allocationSize:主键每次增长值的大小
注意:如果底层数据库不执行序列,会报错:
org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support sequences
@GeneratedValue(strategy = GenerationType.TABLE, generator="myTableGenerator")
@TableGenerator(name = "myTableGenerator",
table = "t_customer3_table",
pkColumnName = "pk_key",
valueColumnName = "pk_value",
pkColumnValue = "teacherId",
initialValue = 100,
allocationSize = 1000)
使用一张特殊的数据库表,保存插入记录时需要的主键值
@GenericGenerator(name="system-uuid", strategy="uuid")
@GeneratedValue(generator="system-uuid")
如果使用hibernate对JPA的实现,可以使用Hibernate对主键生成策略进行扩展,通过@GenericGenerator实现
使用此方法,主键必须为String类型