Hibernate入门Annotation配置(6)
使用Annotation配置映射文件
我们在Hibernate入门实例(5)已经讲了使用xml配置映射文件,本篇我们将使用Annotation配置.
Java中Annotation是从JDK1.5开始的,在这里我不打算讲述Annotation的工作原理以及发展,这部分内容,我以后有时间会专门去学习下.
如果用Annotation的话,我们在主配置文件(hibernate.cfg.xml)的配置和使用xml会有一点差别
  <mapping resource="com/liuyi/bean/student.hbm.xml"/>(使用xml进行配置)
  <mapping class="com.liuyi.bean.Student"/>(使用Annotation进行配置)
其实从主配置文件可以看来映射文件对应的直接是类也就就Student
Student.java
1 package com.liuyi.bean;
2
3 import javax.persistence.Column;
4 import javax.persistence.Entity;
5 import javax.persistence.Id;
6 import javax.persistence.Table;
7
8 @Entity
9 //实体类
10 @Table(name="tb_student")
11 //实体类对应的数据表
12 public class Student
13 {
14 private int id;
15 private String name;
16 private int age;
17
18 @Id //指定类中属性对数据表中主键
19 @Column(name="id") // 数据表中列名对应类中的属性
20 public int getId()
21 {
22 return id;
23 }
24 public void setId(int id)
25 {
26 this.id = id;
27 }
28 public String getName()
29 {
30 return name;
31 }
32 public void setName(String name)
33 {
34 this.name = name;
35 }
36 public int getAge()
37 {
38 return age;
39 }
40 public void setAge(int age)
41 {
42 this.age = age;
43 }
44
45 }
  @Entity:通过@Entity注解将一个类声明为一个实体bean
 @Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)
 @Id:用于标记属性的主键
 @Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前.不过通常放在getter方法的前面.
上面是我们入门实例中使用用的Annotation,Annotation可不仅仅是这么多,基本上使用xml能够配置完成的!所以也会有很多,但这里我们会提到大部分,常用的会使用会用蓝色进行标记
既然@Id是用来配置主键,id的生成策略
@TableGenerator(
name (1)
table (2)
pkColumnName (3)
pkColumnValue (4)
valueColumnName (5)
allocationSize (6)
)
@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。
     name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的"generator"值中
        table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLE
        pkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的
        pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴
        valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3
        allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50
@GeneratedValue:定义主键生成策略,这里因为使用的是TableGenerator,所以,主键的生成策略为GenerationType.TABLE,生成主键策略的名称则为前面定义的”
这里大象想说下,网上有很多文章写的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长,要想使用它,还得在数据库中创建一个序列,如果要更换数据库,那将是一个非常麻烦的事情。SEQUENCE生成方式我们暂且不谈,这里说下采用AUTO和IDENTITY的生成方式,本例采用的是SQL Server 2000作为数据库,所以如果想使用AUTO或是IDENTITY生成策略,则一定要对主键加上identity标识,如identity(1,1)。不过对于AUTO来说,是根据不同的数据库选择最合适的自增主键生成策略。如果使用MySQL,则主键要定义AUTO_INCREMENT,如果是Oracle,则要创建Sequence来实现自增。不管采用何种生成策略,增、删、改这些方法中一定要加入事务,否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!
@Column(
name="columnName"; (1)
boolean unique() default false; (2)
boolean nullable() default true; (3)
boolean insertable() default true; (4)
boolean updatable() default true; (5)
String columnDefinition() default ""; (6)
String table() default ""; (7)
int length() default 255; (8)
int precision() default 0; // decimal precision (9)
int scale() default 0; // decimal scale (10)
)
| (1) | name 可选,列名(默认值是属性名) | 
| (2) | unique 可选,是否在该列上设置唯一约束(默认值false) | 
| (3) | nullable 可选,是否设置该列的值可以为空(默认值false) | 
| (4) | insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true) | 
| (5) | updatable 可选,该列是否作为生成的update语句中的一个列(默认值true) | 
| (6) | columnDefinition 可选: 为这个特定列覆盖SQL DDL片段 (这可能导致无法在不同数据库间移植) | 
| (7) | table 可选,定义对应的表(默认为主表) | 
| (8) | length 可选,列长度(默认值255) | 
| (9) | precision 可选,列十进制精度(decimal precision)(默认值0) | 
| (10) | scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0) | 
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号