Hibernate入门(3):属性映射 & 主键映射

来源:互联网 发布:excel密码破解软件 编辑:程序博客网 时间:2024/05/23 18:36

属性映射

1)@Column 修饰属性

使用 @Column 修饰POJO属性,可以同时指定一些映射信息,常用的信息如下(这些@Column属性都是可选的):
name指定该列的列名length指定该列的最大长度,默认 255nullable指定该是否可以为空,默认 trueunique指定该列是否具有唯一约束, 默认 falsepresicison该列为decimal时,指定该列支持的最大有效数位scale该列为decimal时,指定该列支持的最大小数位table指定该列所属的表名,当需要使用多个表来保存一个实体时,需要指定该属性

2)@Transient 修饰非持久化属性

可以使用@Transient 修饰不参与持久化映射的属性,作为该PO的附加信息属性,被修饰的属性不会与数据表的字段有映射关系;
1
@Entity                
2
@Table(name="users")   
3
public class Users {
4
    @Id
5
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
6
    @Column(name="user_id")   
7
    private int id;
8
  
9
    ....
10
    @Transient
11
    private String description; 
12
}

3)@Enumerated 修饰枚举类型属性

在某些情况下,持久化类的属性是一个枚举类型,即该属性只能接受几个固定的值,这种情况下可以使用 @Enumerated 来修饰;
@Enumerated 有2种储存枚举到数据库的方式,EnumType.ORDINAL 序数储存,EnumType. STRING 字符串储存;

如以下定义一个枚举类:
1
@Entity                
2
@Table(name="users")   
3
public class Users {
4
    @Id
5
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
6
    @Column(name="user_id")   
7
    private int id;
8
  
9
    ....
10
    @Enumerated(EnumType.ORDINAL)  //使用序号储存枚举值
11
    @Column(name="sex")
12
    private Sex sex;
13
}

4)@Lob,@Basic 修饰大数据类型的属性

数据库在保存图片、大段文字时,通常是使用Blob,Clob类型来保存,对应的 JDBC 类型为 java.sql.Blob ,java.sql.Clob,此时可以使用@Lob来修饰这种大数据类型;
当持久化类的属性为 byte[]、Byte[]、java.io.Serializable 类型时,@Lob 修饰属性映射为底层的 Blob 列;
当持久化类的属性为 char[]、Character[]、Java.io.String 类型时,@Lob 修饰属性映射为底层的 Clob 列;
如以下示例保存一张图片的过程
1
public class UserManager {
2
    public static void main(String[] args){
3
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
4
                .configure("hibernate.cfg.xml")
5
                .build();
6
        try{
7
            SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
8
            Session session = sessionFactory.openSession();
9
            Transaction tran = session.beginTransaction();
10
11
            
12
            Users user = new Users();
13
            user.setName("Al-assad");
14
            
15
            //读取本地中的一个图像文件,保存到实体
16
            File file = new File("headshot.png");
17
            byte[] content = new byte[(int)file.length()];
18
            new FileInputStream(file).read(content);
19
            user.setHeadShot(content);
20
            
21
            session.save(user);
22
            tran.commit();
23
            
24
            session.close();
25
            sessionFactory.close();
26
27
        }catch(Exception ex){
28
            StandardServiceRegistryBuilder.destroy(registry);
29
        }
30
    }
31
}
32

5)@Temporal 修饰日期类型的属性

@Temporal 用于修饰日期类型的属性,将Java中的 Java.util.Date,Java.util.Calendar类属性映射为数据库中的 date、time、timestamp类型数据列;
其所在的 value 属性包含3个值:Temporal.DATE(date日期类型),Temporal.TIME(time时间类型),Temporal.TIMESTAMP(时间戳类型) ;



主键映射

在现代数据库建模理论中,建议不使用具有实际意义的物理主键,而使用没有实际意义的逻辑主键。已减少数据库维护的复杂度,Hibernate提供了大量的逻辑主键构造器;
如果实体类的标识属性是基本类型、基本类型的包装类,String,Date等,可以简单使用 @Id 进行修饰;

如果希望 Hibernate 自动生成主键值,则还需要 @GeneratedValue 来修饰标识属性,该标识具有的属性如下(这些属性都是可选的):
strategy指定主键生成策略,包含以下4个属性:
GenerationType.AUTO:默认值,自动选择主键生成策略;
GenerationType.IDENTITY:对于 MySQL,SQL Server 等数据库,选择自动增长的主键生成策略;
GenerationType.SEQUENCE:对于 Oracle 等数据库,选择基于sequence 的主键生成策略,要和 @SequenceGenerator 一同使用;
GenerationType.TABLE:使用辅助表来生成主键,要与
@TableGenerator 一同使用;generator当使用 GenerationType.SEQUENCE,GenerationType.TABLE 主键生成策略时,该属性需要应用@SequenceGenerator,@TableGenerator 生成器;
示例如下:
1
@Entity                
2
@Table(name="users")   
3
4
public class Users {
5
   
6
    @Id                
7
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
8
    @Column(name="user_id")   
9
    private int id;
10
11
    ....
12
}

除了 AUTO,INDETITY,SEQUENCE,TABLE 这4种 JPA 标准的主键生成策略,Hibernate还包含其他的主键生成策略,这些主键生成策略使用 @GenericGenerator 标注;
该标注包含name ,strategy 2个必须属性,strategy属性常用的可选值如下:
increment为 short,int,long 类型生成唯一属性,只能用于没有其他进程往同一个表中插入数据时使用,不可用于集群indentity在 indentity 主键支持的数据表中使用,返回一个short,int 或 long 类型的标识值sequence在 sequence 主键支持的数据表中使用,返回一个short,int 或 long 类型的标识值hilo使用一个低位/高位算法高效地生成short,int 或 long 类型的标识值,该标识值只在一个特定的数据库中是唯一的seqhilo使用一个低位/高位算法高效地生成 short,int 或 long 类型的标识值,需要给定一个数据库sequence名,历史主键保存在Sequence中uuid使用一个128位的UUID算法生成字符串类型的标识符,这个标识符在一个网络是唯一的,UUID被编码为一个32位的十六进制字符串guidSQL Server,MySQL中使用数据库生成的的 GUID 字符串native根据底层数据库的能力选择 identity,sequence,hilo中的
使用示例如下:
1
@Entity                
2
@Table(name="users")   
3
4
public class Users {
5
   
6
    @Id
7
    @GenericGenerator(name="fk_hilo",strategy="hilo")
8
    @GeneratedValue(generator="fk_hilo")  
9
    @Column(name="user_id")   
10
    private int id;
11
12
    ....
13
}







原创粉丝点击