关于JPA


找半天没找到jpa的官方文档,郁闷。百度文档里找到一篇中文版的jpa文档,但是更多的是别人自己写的自己的学习笔记吧,有总比没有好,整理如下:
一、概述

JPA是什么?一个SUN推出的ORM规范,不是框架。具体实现由其他商家提供,目前有hibernate(3.2+),openjpa,toplink。

EJB跟JPA有什么关系?待考察。

sun为什么会推出jpa?Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。

总的来说,JPA包括以下3方面的技术:

1.ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
 
2.JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。  

3.查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

二、实体对象

java中的领域对象,配置好映射,ORM会自动将其持久化到数据库中。

按JPA的规范,实体具备以下的条件:  
必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;  必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final; 
如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;  
需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。

三、使用注解标注元数据(xml太繁琐,就不关注了)

1.如何映射实体对象和表?通过给类增加@Entity标注来表明可以讲此实体与同名的表做映射(不必担心java的驼峰和数据库的对应,数据库表是不区分大小写的),如果类名和表名不同比如大多表的命令是带下划线的,那就使用@Entity(name="T_xxx")
2.如何映射列名,默认也是同名属性和列,如果不同名,需要用@Column(name="xxx"),如果类型比较特殊不是java默认匹配的,可以通过@Column(name="xxx",type="bigint等")来指定。
4.如何表明这一列是主键?增加:
@Id  
@GeneratedValue(strategy = GenerationType.TABLE)
ORM框架是可以在程序实现主键的生成的,所以此处可以指定主键生成的方式,若=aotu就是自动,比如mysql的自增,sqlserver的identity,默认如此。此外如例子中的table,通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。这是比较推荐的。
5.如果我的程序需要类带着某个字段但是这个字段并不需要持久化到db中,怎么办?用@transient标注该字段就ok了。
6.对于java中的继承在db中如何体现?看策略,如果是一一对应那没问题就逐个映射逐个持久化好了,如果是父子类放在同一个表中,就需要对父类和子类增加注释:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) --指定策略,还有joined,TABLE_PER_CLASS 
@DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =DiscriminatorType.INTEGER, length = 1) --指定不同的列
@DiscriminatorValue(value="1")--指定当前类此列的默认值
7.关联关系(也即传说中的一对一,一对多,多对一,多对多)
说说一对多和多对一。举个例子订单和明细,是一对多,在订单类中,这么用:
@OneToMany(mappedBy="order",cascade=CascadeType.ALL)
private Set<OrderDetail> details;
这里的mappedby是表示“Many”方类引用“One”方类的属性名,在这个例子中就表示在OrderDetail类中表示所属订单的那个字段-order。
以我目前粗浅的理解,这俩是成对出现的,分别出现在关联的双方,所以在OrderDetail中,要这样写:
@ManyToOne
@JoinColumn(name="order_id", nullable=false)
private Order order;
不仅需要表明是manytoone,还需要制定join时关联的字段。
cascade表示级联操作,暂没关注。

另外之前还见过reverse等(可能是hibernate独有的吧不确定),以及JPQL查询,有待补充。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值