总结精炼于http://www.yiibai.com/jpa/jpa_architecture.html
其他不错的文章:介绍Jpa注解(注意Mybatis可没有实现Jpa)http://blog.csdn.net/u014421556/article/details/52040263
JPA(Java持久性API)是存储业务实体关联的实体的来源。它显示了如何定义一个面向普通Java对象(POJO)作为一个实体,以及如何与管理关系实体。
类疾病的结构图如下
单元 描述
EntityManagerFactory 这是一个EntityManager的工厂类。它创建并管理多个EntityManager实例。
EntityManager 这是一个接口,它管理的持久化操作的对象。它的工作原理类似工厂的查询实例。
Entity 实体是持久性对象是存储在数据库中的记录。
EntityTransaction 它与EntityManager是一对一的关系。对于每一个EntityManager,操作是由EntityTransaction类维护。
Persistence 这个类包含静态方法来获取EntityManagerFactory实例。
Query 该接口由每个JPA供应商,能够获得符合标准的关系对象。
——————
类和接口之间的关系属于javax.persistence包。下图显示了它们之间的关系。
192R61c4-1.png
EntityManagerFactory和EntityManager的关系是1对多。这是一个工厂类EntityManager实例。
EntityManager和EntityTransaction之间的关系是1对1。对于每个EntityManager操作,只有一个EntityTransaction实例。
EntityManager和Query之间的关系是1对多。查询数众多可以使用一个EntityManager实例执行。
EntityManager实体之间的关系是1对多。一个EntityManager实例可以管理多个实体。
————————
对象关系映射
对象关系映射(ORM)简要地告诉什么是ORM以及它是如何工作。 ORM是从对象类型的数据隐蔽到关系型,反之亦然编程能力。
ORM主要特征是映射或绑定一个目的是它的数据库中的数据。而映射,我们要考虑的任何其他表中的数据,数据的类型,并具有自一个或多个实体的关系。
高级功能
惯用的持久性:它使您能够编写使用面向对象的类持久性类。
高性能:它有许多抓取技术和充满希望的锁定技术。
可靠的:它是高度稳定的,被很多专业程序员。
ORM架构
在ORM架构如下所示。
194HR940-0.png
在上述体系结构解释了如何对象数据存储到关系数据库中的三个阶段。
第1阶段
第一阶段,命名为对象数据阶段,包括POJO类,服务接口和类。它是主要的业务组件层,其具有业务逻辑操作和属性。
例如,让我们举个员工数据库的架构。
Employee POJO类包含属性,如ID,姓名,工资和标识。它也包含类似属性setter和getter方法。
Employee DAO/服务类包含服务方法,如建立员工,发现员工和删除员工。
第2阶段
第二阶段,称为映射或持久性的阶段,包括JPA提供者,映射文件(orm.xml),JPA装载器和对象网格。
JPA提供者:这是一个包含了JPA(javax.persistence)供应的产品。例如EclipseLink,Toplink,Hibernate等。
映射文件:映射文件(orm.xml中)包含在关系数据库中的一个POJO类的数据和数据之间的映射配置。
JPA装载器:在JPA加载器的工作原理就像一个高速缓冲存储器。它可以加载关系网格数据。它的工作原理类似数据库的副本与服务类POJO数据(POJO类的属性)进行交互。
对象网格:它是可存储的关系数据的副本,如高速缓冲存储器的临时位置。对数据库的所有查询首先被实现在对象网格的数据。只有提交它才会影响到主数据库。
第3阶段
第三阶段是关系数据相关。它包含在逻辑上连接到所述业务组件的关系数据。如上所讨论的,仅当业务组件提交该数据,它被存储到数据库中的物理。在此之前,已修改的数据被存储在高速缓冲存储器作为一个网格格式。在获取数据的过程和存储数据是相同的。
上述三个阶段的编程交互的机制被称为对象关系映射。
————————
http://www.yiibai.com/jpa/jpa_orm_components.html#article-start
mapping.xml文件指示JPA的供应者来映射实体类与数据库表。
也可以用注解。
注解 描述
@Entity 声明类为实体或表。
@Table 声明表名。
@Basic 指定非约束明确的各个字段。
@Embedded 指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id 指定的类的属性,用于识别(一个表中的主键)。
@GeneratedValue 指定如何标识属性可以被初始化,例如自动,手动,或从序列表中获得的值。
@Transient 指定的属性,它是不持久的,即,该值永远不会存储在数据库中。
@Column 指定持久属性栏属性。
@SequenceGenerator 指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator 指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@AccessType 这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),然后进入FIELD明智的。如果设置@AccessType(PROPERTY),然后进入属性发生明智的。
@JoinColumn 指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@UniqueConstraint 指定的字段和用于主要或辅助表的唯一约束。
@ColumnResult 参考使用select子句的SQL查询中的列名。
@ManyToMany 定义了连接表之间的多对多一对多的关系。
@ManyToOne 定义了连接表之间的多对一的关系。
@OneToMany 定义了连接表之间存在一个一对多的关系。
@OneToOne 定义了连接表之间有一个一对一的关系。
@NamedQueries 指定命名查询的列表。
@NamedQuery 指定使用静态名称的查询。
Java Bean标准
Java类封装了实例的值及其行为为对象称为一个单元。 Java Bean是一个临时的存储和可重用的组件或对象。它是有一个默认的构造函数和getter和setter方法来初始化实例序列化的类单独的属性。
Bean约定
bean包含其默认构造函数或包含序列化实例的文件。因此,一个bean可以实例化另一个bean。
bean属性可以被隔离成布尔属性或者非布尔属性。
非布尔属性包含getter和setter方法。
布尔属性包含setter和方法。
任何字段的getter方法应从小字母get(Java方法的公约)开始,之后使用大写字母开头的字段名。例如,字段名为salary,因此这一字段的getter方法为getSalary()。
任何属性的setter方法应该先从小字母的集合(Java方法公约)开始,继续以大写字母,参数值设置为字段开头的字段名。例如,字段名为salary,因此这一字段的setter方法是setSalary(double sal )。
对于布尔型属性,方法是检查它是否是 true 或 false。例如,Boolean属性为空,则该字段的就是方法isEmpty()。
————————————————————
JPA实体管理器
就是几个例子。
创建:
public class CreateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee = new Employee( );
employee.setEid( 1201 );
employee.setEname( "Gopal" );
employee.setSalary( 40000 );
employee.setDeg( "Technical Manager" );
entitymanager.persist( employee );
entitymanager.getTransaction( ).commit( );
entitymanager.close( );
emfactory.close( );
}
}
更新Employee:
public class UpdateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee=entitymanager.
find( Employee.class, 1201 );
//before update
System.out.println( employee );
employee.setSalary( 46000 );
entitymanager.getTransaction( ).commit( );
//after update
System.out.println( employee );
entitymanager.close();
emfactory.close();
}
}
————————————
还有持久化语言:JPQL
public class ScalarandAggregateFunctions
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager();
//Scalar function
Query query = entitymanager.
createQuery("Select UPPER(e.ename) from Employee e");
List<String> list=query.getResultList();
for(String e:list)
{
System.out.println("Employee NAME :"+e);
}
//Aggregate function
Query query1 = entitymanager.
createQuery("Select MAX(e.salary) from Employee e");
Double result=(Double) query1.getSingleResult();
System.out.println("Max Employee Salary :"+result);
}
}
————
再高级映射,就是支持继承,支持一对一、多对多之类的。
————
还有表中API。就是用方法进行CURD操作。
————
网友评论