JPA :
三个核心组件(EntityManager,褓,JPQL)
JPA实体状态演化
find() /getReference() --new --新建
save -- 托管
-- close(),clear()--脱管
-- delete() --删除
----垃圾回收
merge() 不会把当前实体转为“托管”状态
remove() 要求必须处于托管状态
应用程序面向JPA编程,底层ORM技术可以自由切换
OJB、OpenJPA ---开源免费的ORM框架
java领域的3大服务器
IBM WebSphere
Oracle(Bea) WebLogic(OpeenJPA)
JBoss JBoss(Hibernate JPA实现)
Hibernate带给开发者的是简便的、面向对象的开发
JPA带给开发者的是一种统一:它可以结束各个ORM框架的斗争
局部事务: 通过Connection控制的
全局事务:通过UserTrasaction控制
Hibernate:
POJO + 映射文件 ----PO
JPA:
POJO + Annotation ----- Entity DEMO (课堂版,不用)
所有的持久化操作必须在事务中完成。
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("qs");
EntityManager em = emf.createEntityManager();
对于JavaSE ,persistence.xml直接放到类加载目录META-INF目录下
对于EJB,persistence.xml放到 EJB 的META-INF目录下
对于web,persistence.xml放到 web-inf目录下的 META-INF目录下
DEMO (EE实战教程 代码)
大数据,上传图片 DMEO
一个持久单元对应一个EntityManagerFactory
注释: DEMO
@Entity 可以指定一个实体,类
@Table(name="fff")
普通属性不用映射,会自动的
@Transient 表示此属性不会保存到数据库中
@Lob 修饰大数据类型
@Basic 指定是否缓迟加载大数据类型
映射复合属性
映射主键
@Id
@GeneratidValue()
OneToOne 有MapBy属性的是主表
1.应该通过主表实休来控制关联关系
2.保存实体时,先保存主表的实体,否则会多出update语句
JoinColumn 外键列名 有MapBy属性的是主表
通过从表实体控制关联关系
joinTable 连接表
应该在两边增加joinTable ,除非增加了MapBy(增加了MapBy的是主实体)
关联实体排序: DEMO OrderBy
DiscriminatorColumn 增加辨别者列
DiscriminatorValue
托管 manage(被管)
脱管 detached(游离)
Hibernate有拦截器和事件机制:
通过拦截器
onSave()
onDelete()
onLoad()
..
Session的Save()方法就触发onSave()
.....load onLoad
JPA更灵活
@Prepersist
任意方法名()
@PostLoad....
生命周期 DEMO
如上例直接在实体内定义生命周期,不好,可以独立下来,专门放生命周期方法(类监听器)
实体内@EntityListeners(PersonPersistListener.class) DEMO
JPA查询: DEMO
JPQL与HQL的最大区别在于:
1.JPQL不能省略select子句。(在特殊情况,如果使用Hibernate的实现,允许select省略)
2.JPQL中占位符参数可以紧跟一个N,N代表一个索引值
Query既支持JPQL查询也支持原生的SQL查询
Query由EntityManager创建
下面 两个都属性JPQL查询
createNamedQuery(String name)
| createQuery(String qlString) |
原生SQL查询
既可以使用?占位符,也可以使用参数设置
Query(select ... ?1 .... ?2)
setParameter( 1 , "xxx")

4711





