学习笔记_JPA学习
一、何为JPA
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
由于orm框架各自为政,sun渴望定义统一的api,使得对于各种orm框架都可以使用,比如Hibernate、TopLink。
二、主要思想
ORM映射元数据:JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来;
查询语言:这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。(JPQL)
三、主要优点
1)标准化
2)容器级特性的支持
3)简单方便
4)查询能力强
四、相关
1)JPA规范已经在很多ORM框架中已经实现了,比如hibernate,toplink等等。
2)对于JPA,其在META-INF中必须含有persistence.xml配置,主要实现持久化的相关配置,包括数据库连接配置,相关的实体类配置等等。配置如下:
由于是使用hibernate实现的jpa,其中许多配置属性和hibernate中类似。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns:persistence="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 persistence_1_0.xsd ">
<!--
Name属性用于定义持久化单元的名字 (name必选,空值也合法);
transaction-type 指定事务类型(可选)
-->
<persistence-unit name="unitName" transaction-type="JTA">
<!-- 描述信息.(可选) -->
<description> </description>
<!-- javax.persistence.PersistenceProvider接口的一个实现类(可选) -->
<provider> </provider>
<!-- Jta-data-source和 non-jta-data-source用于分别指定持久化提供商使用的JTA和/或non-JTA数据源的全局JNDI名称(可选) -->
<jta-data-source>java:/MySqlDS</jta-data-source>
<non-jta-data-source> </non-jta-data-source>
<!-- 声明orm.xml所在位置.(可选) -->
<mapping-file>product.xml</mapping-file>
<!-- 以包含persistence.xml的jar文件为基准的相对路径,添加额外的jar文件.(可选) -->
<jar-file>../lib/model.jar</jar-file>
<!-- 显式列出实体类,在Java SE 环境中应该显式列出.(可选) -->
<class>com.domain.User</class>
<class>com.domain.Product</class>
<!-- 声明是否扫描jar文件中标注了@Enity类加入到上下文.若不扫描,则如下:(可选) -->
<exclude-unlisted-classes/>
<!-- 厂商专有属性(可选) -->
<properties>
<!-- hibernate.hbm2ddl.auto= create-drop / create / update -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
3)对于用hibernate实现的jpa,需要导入hibernate的相关包及hibernate实现jpa的包。
五、注释标注
对于jpa,一般采用注释来标注,当然也可以选择xml来标注。
基于注释标注,相关注释解释如下(jpa注释都在javax.persistence包下):
1)@Entity:声明一个实体
2)@Table:表示一张表,name属性为数据库表名
3)@Id:表示表的主键
4)@GennerateValue:表示值是怎样生成的,有自动增长的,随机生成的等不同策略。
5)@Column:表示表的一列,有name,length,nullable,unique等属性。
6)@Temporal:表示关于时间类型,包括time,timestamp等等。
7)@Lob:表示大文本数据,在数据库中将会以LongBlob等类型表示。
8)@Enumerated:表示通过枚举类型设置的,可以设置枚举类型使得数据库保持index还是枚举值。
9)@Basic:表示加载类型,可以设置懒加载等等。
10)@Transient:设置此属性不写入数据库中(数据库中未有对应的列)。
11)@oneToMany:一对多关系
12)@manyToOne:多对一关系
13)@OneToOne:一对一关系
14)@ManyToMany:多对多关系
15)@JoinTable:关联的表
16)@JoinColumn:关联的列
17)@EmbeddedId:自定义类型作为Id
18)@Embeddable:表示自己自定义的类型将作为参数
六、操作数据库
可以通过实体管理器来操作数据库的增删查改等操作,而要得到实体管理器需要通过实体管理器工厂得到(工厂模式)。
eg:
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName"); EntityManager manager=factory.createEntityManager();
其他操作和hibernate类似,JPQL和HQL类似。

浙公网安备 33010602011771号