推荐阅读:JPA
criteria 查询:类型安全与面向对象

来源: http://blog.sina.com.cn/s/blog_49fd52cf0100rzjn.html

一个普通的POJO类通过@Entity可以映射成为可持久化的类;

类JavaBean风格:

·类属性必须为private;

·有Getter和Setter方法;



映射实体:@Entity

# @Entity实体必须有一个无参的构造方法;

# 实现Serializable接口,建议每一个Entity都实现该接口;

# 其中,Entity中,name属性表示实体的名称,比如:

@Entity(name=Contacts)

public class ContactsEO{

...

}

在JPA执行jpql的时候,需要使用Contacts作为实体名称,而不是ContactsEO。

String jpql = "select * from Contacts c";

# 如果name没有配置,则实体名默认为类名。



可继承性:

# 实体可继承,非实体类可以继承自实体类,实体类也可以继承自非实体类;

# 抽象类也可以标注为实体类;



标注主键:

# 一个实体类至少要有一个主键(Primary Key);

# 使用@Id标注为实体主键;



默认实体映射:

# 一个类标注了@Entity的可持久化类,如果不标注其他任何注释,该类的属性和方法自动映射为数据库中默认的表和字段。如:

@Entity

public class ContactEO implement Serializable{

    public ContactEO(){}

    private Integer id;

    private String name;

    //getter和setter方法略

}

则该实体默认对应的数据库表名为:contacteo,字段为:int id; varchar name;



映射表和字段:

# @Table注释可定义映射的表;

# @Column注释可定义映射到字段;



映射表@Table:

@Target({TYPE}) @Retention(RUNTIME)

public @interface Table{

    String name() default "";

    String catalog() default "";

    String schema() defalut "";

    UniqueConstraint[] uniqueConstraints() default {};

}

# @Table必须标注在类名前;

# name属性表示实体所对应表的名称;

# catalog和schema属性表示实体指定点目录名称或数据库名称;

# uniqueConstraints属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束;

# 若使用uniqueConstraints标记时,徐奥配合标记UniqueConstraint标记来使用;

示例:

@Entity

@Table(name="contact", schama="jpadb", uniqueConstraints={

    @UniqueConstraint(

        columnNames = {"name", "email"}

    )},

    @UniqueConstraint(

         columnNames = {"other_col_1", "other_col_2"}

    )}

)

# 说明:在注释中,属性值是不区分大小写的。





映射方法和属性(@Column)

@Column标记表示所持久化属性所映射表中的字段。

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface Column{

    String name() default "";

    boolean unique() default false;

    boolean nullable() default false;

    boolean insertable() default false;

    boolean updateable() default false;

    String columnDefinition() default "";

    String table() defalut "";

    int lenght() default 255;

    int precision() default 0;

    int scale() default 0;

}

# 标记可以标注在Getter方法前或属性前;

# name为字段名;

# unique为字段是否唯一标识,默认为false;

# nullable为该字段是否可以为null值,默认为true;

# insertable为使用“INSERT”脚本插入数据时,是否需要插入该字段的值;

# updateable为使用“UPDATE”脚本更新数据时,是否需要更新该字段的值;

以上两个多用于只读属性,比如主键或外键等,这些字段通常为自动生成的。

# columnDefinition表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用;

# table属性表示当映射多个表时,指定表的表中的字段,默认值为主表的表名;

# lenght表示字段的长度;

# precision和scale均表示精度;

示例:

@Column(name="contact_name", nullable=false, length=200)

@Column(name="contact_name", nullable=false, columnDefinition="clob not null")



映射优化:

· 基本类型 VS 封装类型

# 当为null时,若此时Entity的对应属性的类型为int,则将一个null转换为int型必定产生转换异常;但是如果此时Entity属性类型为Integer,它是一个对象,对象的值可以为null,此时不会有问题;

# 建议标注实体的属性使用Java基本类型的包装类(这可能会牺牲一些转换的效率);



· @Basic设置加载方式

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface Basic {

    FetchType fetch() default EAGER;

    boolean optional() default true;

}

# 默认Entity的属性加载方式都是即时加载(EAGER);

# 两种加载方式:

    LAZY惰性加载

    EAGER即时加载(默认)

示例:@Basic(fetch=FetchType.EAGER)



主键映射:

# 主键标识@Id

# @GeneratedValue主键生成策略:TABLE, SEQUENCE, IDENTITY, AUTO.

    @GeneratedValue(strategy = GenerationType.SEQUENCE  - Oracle

    @GeneratedValue(strategy = GenerationType.IDENTITY  - SQL server

# 生成策略:自增主键、表生成器(@TableGenerator)、Sequence生成器(@Sequence)、Identity生成器、复合主键(@IdClass)和嵌入式主键(@Embeddedld)。

# JPA可定义的生成主键策略比较:

    ·SEQUENCE,IDENTITY主要针对一些特殊的数据库,未确定系统要支持的数据库类型时,最好不要使用。

    ·AUTO用于比较简单的主键,对主键生成策略要求少

    ·TABLE生成策略是将主键的值持久化在数据库的表中,因为只要是关系型数据库,都可以创建一个表,专门来保存生成的值,这样就消除了数据库之间的不兼容性,既能保证支持多种数据库,又有一定的灵活性,建议使用。

    ·如果以上方法不能满足需求时,可以通过一定的规则来设置主键的值,可以使用UUID,使其在程序中自动生成,然后映射到实体的主键上,不能通过JPA的主键生成策略来实现。



示例:

@Id

@GeneratedValue(strategy=GenerationType.AUTO)



映射特殊类型:

· 映射Blob和Clob类型(@Lob)

# Blob和Clob类型都可以通过@Lob属性来标注(text类型字段也可以用该属性标注);

# Clob(Character Large Object)类型是长字符串类型,映射到为实体中的类型可以为char[]、Charater[]或者String类型;

# Blob(Binary Large Object)类型是字节类型,映射为实体中的类型可为byte[]、Byte[]或者实现了Serializable接口的类;

# 因为上述两种类型的数据一般占用内存比较大,因此通常使用惰性加载;



· 映射时间(Temporal)类型(@Temporal)

# 时间日期类型,需要用@Temporal来标注;

# TemporalType枚举类型定义为:DATE, TIME, TIMESTAMP;默认为TemporalType.TIMESTAMP;



· 映射枚举(Enumerated)型

# 通过@Enumerated类标注枚举类型;

# 使用@Enumerated时需要注意:

    枚举类型有两个属性:名称和值。通过EnumType来定义:ORDINAL,
STRING

    ORDINAL表示持久化的为枚举类型的值;STRING表示持久化的为枚举类型的名称;

# 建议使用ORDINAL类型来持久化枚举类型;

# 枚举类型的定义位置(实体内部或外部)根据具体情况而定。



· 映射非持久化类型(@Transient)

# 如果实体中有属性或者Getter方法并不需要持久化,则需要使用@Transient来标注。

JPA映射持久化对象(Entity)的更多相关文章

  1. IT忍者神龟之Hibernat持久化对象-数据表映射配置回想

    1.持久化对象POJO编写规则: 1) 有空參public构造器: 2) 提供标识属性.映射数据表主键: 3) 属性提供setter和getter方法. 4) 属性使用基本数据类型的包装类型.基本类型 ...

  2. 分享公司DAO层数据库结果映射到对象的方法

    主题 前面写过一篇文章,分享了公司是怎么动态封装SQL查询条件的(http://www.cnblogs.com/abcwt112/p/5874401.html). 里面提到数据库查询结果二维数组最后是 ...

  3. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  4. day35 02-Hibernate持久化对象状态及状态转换

    hibernate内置有一个c3p0,不用引入c3p0的jar包也行. 现在其实可以不用去创建表和实体类.因为hibernate可以自动帮我们生成.只要把映射建好了它就可以自动帮我们生成. 创建实体类 ...

  5. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...

  6. 2.一起来学hibernate之配置文件1与持久化对象

    学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件 ...

  7. Hibernate之Session对象的相关方法以及持久化对象的状态

    一.持久化对象的状态        站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...

  8. Hibernate持久化对象

    持久化类应遵循的规则: 有无参构造器,构造器的修饰符>=默认访问控制符 有标识属性,映射数据库表的主键,建议使用基本类型的包装类 每个成员有setter和getter 非final修饰的类 重写 ...

  9. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

随机推荐

  1. 第8章 Linux磁盘与文件系统管理

    认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...

  2. Java实现的词频统计——Web迁移

    本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...

  3. break,continue,return 的区别

    (1)break 跳出当前循环体 (2)continue 跳过当前循环体continue后面的代码,继续执行下一个循环 (3)return 和循环没关系,就是跳出该函数

  4. Linux 查看端口占用情况

    转自:http://www.cnblogs.com/fabulousyoung/p/4071150.html 例子,查看80端口的占用情况: lsof -i:80   或者: netstat -apn ...

  5. bzoj4569-萌萌哒

    题目 有一个长度为\(n\)的十进制数,用\(s\)表示.有\(m\)个限制条件,每个条件形如:\((l_1,r_1,l_2,r_2)\),表示\(s[l_1:r_1]=s[l_2:r_2]\). 现 ...

  6. 【uoj#310】[UNR #2]黎明前的巧克力 FWT

    题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...

  7. C++解析(24):抽象类和接口、多重继承

    0.目录 1.抽象类和接口 1.1 抽象类 1.2 纯虚函数 1.3 接口 2.被遗弃的多重继承 2.1 C++中的多重继承 2.2 多重继承的问题一 2.3 多重继承的问题二 2.4 多重继承的问题 ...

  8. C++解析(11):对象的构造

    0.目录 1.对象的初始化 2.构造函数 3.无参构造函数与拷贝构造函数 4.小结 1.对象的初始化 对象中成员变量的初始值是多少? 下面的类定义中成员变量i和j的初始值是什么? 从程序设计的角度,对 ...

  9. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 12  Solved: 9[Submit][Status][Web Boar ...

  10. 【ZOJ3316】Game(带花树)

    [ZOJ3316]Game(带花树) 题面 Vjudge 翻译: 给定棋盘上\(n\)个旗子 一开始先手可以随便拿, 然后每次都不能取离上次的曼哈顿距离超过\(L\)的旗子 谁不能动谁输. 问后手能否 ...