一起 Gank JPA (一)

1.JPA概述
       JPA全称Java Persistence API. JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

       Sun引入新的JPA ORM规范出于两个原因:
       其一,简化现有Java EE和Java SE应用开发工作;
       其二,Sun希望整合ORM技术,实现天下归一。

       JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。

        JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。

        ORM映射元数据
        JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

        API
        用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

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

2、实体对象
       访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。
       下面我们开始真刀真枪的Gank, 新建万能的 Student 实体。

/**
 * @Entity 将实体标记为持久化实体 ,默认情况下类名即为表名。
 * 
 * @Table(name = "T_STUDENT") 指定持久化实体对应数据库表明为“T_STUDENT”
 */
@Entity
@Table(name = "T_STUDENT")
public class Student implements java.io.Serializable{
	private static final long serialVersionUID = -7442161782948585590L;
	/**
	 *@Id 对应的属性是表的主键
	 *
	 *@GeneratedValue 主键的产生策略
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="STU_ID")
	private Long stuId;
	/**
	 *@Column 属性对应的表字段
	 *
	 *length: 字段的长度
	 *name: 字段的名称
	 *nullable: 字段不能为空
	 *unique: 唯一性约束
	 */
	@Column(length = 32, name = "STU_NAME", nullable = false, unique = true)
	private String stuName;
	
	/**
	 * @Temporal(value = TemporalType.DATE)
	 * 属性类型为时间
	 */
	@Temporal(value = TemporalType.DATE)
	private Date birthday;
	@Temporal(value = TemporalType.TIMESTAMP)
	private Date createTime;
	/**
	 * @Lob 
	 * 属性类型为大字段
	 */
	@Lob
	private String info;
	/**
	 * @Lob
	 * @Basic(fetch = FetchType.LAZY)
	 * 属性类型为二进制文本
	 */
	@Lob
	@Basic(fetch = FetchType.LAZY)
	private byte[] image;
	/**
	 *@Enumerated(EnumType.ORDINAL) 
	 * 属性类型为枚举
	 */
	@Enumerated(EnumType.ORDINAL)
	private Gender gender;
	/**
	 * @Transient 
	 * 对应的字段不持久(不保存到数据库)
	 */
	@Transient
	private String filePath;
       //对应的set、get方法省略

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

3.使用注解元数据

      @Entity 
      将实体标记为持久化实体 ,默认情况下类名即为表名

      @Table(name = "T_STUDENT")
       指定持久化实体对应数据库表名,name = "T_STUDENT"  表示 Student  保存到 T_STUDENT 表中
    
      @Id
       对应的属性是表的主键

      @GeneratedValue
       主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:如SqlServer对应identity,MySql对应auto increment。

       在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
     (1) IDENTITY:表自增键字段,Oracle不支持这种方式;

     (2) AUTO: JPA自动选择合适的策略,是默认选项;

     (3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;

     (4)TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

       不同的JPA实现商生成的表名是不同的:

        如 OpenJPA生成openjpa_sequence_table表

         Hibernate生成一个hibernate_sequences表,

         而TopLink则生成sequence表。


      @Column
      属性对应的表字段。
      name: 字段的名称
      length: 字段的长度
      nullable: 字段不能为空
      unique: 唯一性约束
      ...

     @Temporal(value = TemporalType.DATE)
      如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。在javax.persistence.TemporalType枚举中定义了3种时间类型:

     (1) DATE :等于java.sql.Date

     (2)TIME :等于java.sql.Time

     (3) TIMESTAMP :等于java.sql.Timestamp


       @Lob
       属性类型为大字段

      @Enumerated(EnumType.ORDINAL)
       属性类型为枚举
       javax.persistence.Enumerated .EnumType定义了2种枚举类型:
      (1)ORDINAL:表示持久化的为枚举类型的值
      (2)STRING:表示持久化的为枚举类型的名称

        @Transient
        对应的属性不持久(不保存到数据库)

 

        更多详细介绍请点击查阅 JPA-api 

        点击下载本章源码实例下载

       

       最后附上项目的结构图:

        

一起 Gank JPA (一)
 

 
 

你可能感兴趣的:(jpa,jpa注解,jpa教程,jpa源码,jpa-api)