`
favor
  • 浏览: 142010 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JPA入门

阅读更多
jpa使用java EE 5的Annotation机制不同于hibernate等的把配置信息写到xml中
类似于Hibernate 的传统模式的ORM 框架大都是采用xml 作为配置文件,但采用文本的xml 配置存在一些缺陷:
1.描述符多,不容易记忆和掌握
2.无法做自动的校验,需要人工排错
3.当系统变大时,大量的 xml 配置难以管理
4.读取和解析 xml 配置非常耗时,导致应用启动缓慢,不利于测试和维护
5.做 O/R Mapping 的时候需要在java 文件和xml 配置文件之间交替,增大了工作量
6.运行中保存 xml 配置需要消耗额外的内存
采用标注可以很好的解决这些问题:
1. 描述符大量减少。以往在xml 配置中往往需要描述java 属性的类型,关系等等。
而标注本身就是java 语言,从而省略了大量的描述符
2. 编译期校验。错误的批注在编译期间就会报错。
3. 标注批注在java 代码中,避免了额外的文件维护工作
4. 标注被编译成java bytecode,消耗小的多内存,读取也非常迅速,往往比xml 配
置解析快几个数据量级,利于测试和维护

@Entity:将JavaBean 标注为一个实体.
@Table:定义当前Entity 对应数据库中的表,用name属性标识
@Id:定义了实体的主键信息。在一个实体类中只有一个主键标注,而此标注也是必须
的!它本身没有任何额外的属性可以设置
@GeneratedValue:一般它和ID 的标注配合使用,用来制定主键的生产策略。通过
strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略,如
SqlServer 对应identity,MySql 对应auto increment。在javax.persistence.GenerationType
这个枚举类中定义了以下几种可供选择的策略:
1) IDENTITY:表自增键字段,Oracle 不支持这种方式;
2) AUTO: JPA 自动选择合适的策略,是默认选项(不幸的是大部分时候都会选择成
Sequence);
3) SEQUENCE:通过序列产生主键,还可以进一步通过@SequenceGenerator 标注来指定
更详细的生产方式,MySql 不支持这种方式(注:@SequenceGenerator 用法示例:
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name="SEQ_TEST", // 此生成器的别名
sequenceName="User_SEQ",// 对应的 Oracle sequence 的名字
allocationSize=25)
);
4) TABLE:通过表产生主键,框架借由表模拟序列(sequence)产生主键,使用该策略可
以使应用更易于数据库移植。不同的JPA 厂商所默认生成的表名是不同的,如 OpenJPA
生成openjpa_sequence_table 表,Hibernate 生成一个hibernate_sequences 表,而
TopLink 则生成sequence 表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME
和SEQ_COUNT。
另外还有一个重要的属性就是 generator,它可以更进一步制定主键生成器所采用的参
数,例如sequence 表的表名可以这样定义:@GeneratedValue(strategy=SEQUENCE,
generator="CUST_SEQ") 。同样的也可以用于TABLE 方式的生成器上:
@GeneratedValue(strategy=TABLE, generator="CUST_GEN")。
@Column:属性或者变量对应的表字段。一般来说我们并不需要指定表字段的类型,
因为JPA 会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,
以便可以自动生成DDL 语句;还可以指定一些其它的属性例如是否唯一(unique),是否可
以为空(nullable),是否可以插入和更新等等(insertable 和updatable);name 属性指定
了它对应于数据库中的列名。如果是时间类型,一般还需要指定精度,用@Temporal 来进
行标注。同样的这个标注也不是必须的,如果没有写任何参数的话,它的名字和类型都和当
前标注的属性或者变量的名字和类型相同。
@Temporal:如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必
须指定具体时间类型。在javax.persistence.TemporalType 枚举中定义了3 种时间类型:
1) DATE :等于java.sql.Date;
2) TIME :等于java.sql.Time;
3) TIMESTAMP :等于java.sql.Timestamp。
用法示例:
@Column(name = "BIRTHDAY")
@Temporal(TemporalType.DATE)
。同样的这个标注不是必须的,但是它没有默认值,所以必须指定一个取值。

以上是一些常用的标注简单介绍
@Entity(name="User")
@Table(name = "myuser", catalog = "test", uniqueConstraints = {})
public class Myuser implements java.io.Serializable {
// 变量定义
private Integer id;
private String username;
private String password;
public Myuser() {
}
// Property accessors
@Id
@Column(name = "id", unique = true, nullable = false, insertable =
true, updatable = true)
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics