hibernate5实体映射注解配置注解全面解析
2017-05-23 09:44
501 查看
版权声明:转载请注明本文源地址
目录(?)[+]
相对于经典风格的实体配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence
API)注解配置能使我们的开发更加敏捷便利.在本系列前面部分的文章中,我们围绕JPA注解风格配置来逐步深入学习。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
在实例中,我们使用了一些常用的注解属性,并配上注释进行了细致说明
如果某属性没有注解,该属性将遵守下面的规则:
1. 如果属性为单一类型,则映射为@Basic
2. 如果属性对应的类型实现了Serializable, 则属性被映射为@Basic并在一个列中保存该对象的serialized版本
3. 如果该属性的类型为Java.sql.Clob 或 java.sql.Blob,则作为@Lob并映射到适当的LobType。
2
3
4
1
2
3
4
这时候,我们运行测试方法,hibernate会自动帮我们在数据库中生成相应的”大容量类型“属性:
如果我们想自定制数据库中生成的属性类型,可以使用下面示例配置:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
此时对应数据库中生成数据类型:
![](https://img-blog.csdn.net/20160330134417128)
目录(?)[+]
相对于经典风格的实体配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence
API)注解配置能使我们的开发更加敏捷便利.在本系列前面部分的文章中,我们围绕JPA注解风格配置来逐步深入学习。
配置实例
下面先看一个实体类的配置实例:package com.zeng.model; import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity//声明当前类为hibernate映射到数据库中的实体类 @Table(name = "t_article2",catalog = "catolog",schema = "schema",uniqueConstraints = {@UniqueConstraint(columnNames = {"title","content"})}) //通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字 //@UniqueConstraints 可以定义表的唯一约束。在title,和content加上唯一约束 public class User { @Id//声明此列为主键,作为映射对象的标识符 /** * @GeneratedValue注解来定义生成策略 * GenerationType.TABLES 当前主键的值单独保存到一个数据库的表中 * GenerationType.SEQUENCE 利用底层数据库提供的序列生成标识符 * GenerationType.IDENTITY 采取数据库的自增策略 * GenerationType.AUTO 根据不同数据库自动选择合适的id生成方案,这里使用mysql,为递增型 */ @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(insertable = true,length = 20,nullable = false,name = "user_name",unique = true,updatable = true) @Version //注解用于支持乐观锁版本控制。 private String name; @Column(scale = 1,precision = 1) private Double salary; /** * @Basic 基本属性类型映射,注解于非Static 非transient的属性, * 这时候我们可以为其声明抓取策略等属性 * fetch: 获取策略,当以session.get()方法获取数据库对象时: * fetchType.LAZY为懒加载,会在第一次使用该属性(如调用getAge()方法)时才获取。 * FetchType.EAGER为即时加载。 * optional:表示当前属性是否可选,默认为true,如果为false,则在持久化到数据库时,如果此属性为null,则会失败 */ @Basic(fetch = FetchType.EAGER,optional = true) private Integer age; @Transient//被标注此注解的属性不会被持久化到数据库 private String temp; /** * @Lob 注解表示属性将被持久化为Blob或者Clob类型, * 具体取决于属性的类型, java.sql.Clob, Character[], char[] 和 java.lang.String这些类型的属性都被持久化为Clob类型, * 而java.sql.Blob, Byte[], byte[] 和 serializable类型则被持久化为Blob类型. */ @Lob private String desc; /** * @Temporal 标注在日期等属性上,声明映射为数据库的特定诶其属性类型,默认为java.sql.Timestamp(TemporalType.TIMESTAMP) * 此外还有java.sql.date(TemporalType.DATE)、java.sql.Time(TemporalType.TIME) */ @Temporal(TemporalType.TIME) private Date birthDate; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
在实例中,我们使用了一些常用的注解属性,并配上注释进行了细致说明
拓展分析
除了上面注释的说明,我们还需要补充的说明是1. @Column常用属性解析
属性名 | 说明 | 默认值 |
---|---|---|
unique | 可选,是否在该列上设置唯一约束 | false |
nullable | 可选,是否设置该列的值可以为空 | false |
insertable | 可选,该列是否作为生成的insert语句中的一个列 | true |
updatable | 可选,该列是否作为生成的update语句中的一个列 | true |
columnDefinition< cf52 /td> | 可选: 为这个特定列覆盖SQL DDL片段 (这可能导致无法在不同数据库间移植)比如我们想把Integer readNum 设为默认0,可使用此属性: INT DEFAULT 0 | 无 |
table | 可选,定义对应的表 | 默认为当前类对应表 |
length | 可选,列长度 | 255 |
precision | 可选,列十进制精度(decimal precision) | 0 |
scale | 可选,如果列十进制数值范围(decimal scale)可用,在此设置 | 0 |
1. 如果属性为单一类型,则映射为@Basic
2. 如果属性对应的类型实现了Serializable, 则属性被映射为@Basic并在一个列中保存该对象的serialized版本
3. 如果该属性的类型为Java.sql.Clob 或 java.sql.Blob,则作为@Lob并映射到适当的LobType。
2. @Lob注解属性
对于一些容量大的属性如文章、图片的数据,如果我们要保存到数据库,可以使用@Lob注解,先在User类中添加下面一个属性实例:@Lob private String text; @Lob private Byte[] image;1
2
3
4
1
2
3
4
这时候,我们运行测试方法,hibernate会自动帮我们在数据库中生成相应的”大容量类型“属性:
Field | Type | Null | Default |
---|---|---|---|
image | longblob | YES | NULL |
text | longtext | YES | NULL |
@Lob @Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "BLOB", nullable = true) private String pro1; @Lob @Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "tinytext", nullable = true) private String pro2; @Lob @Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "mediumtext", nullable = true) private String pro3; @Lob @Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "text", nullable = true) private String pro4;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
此时对应数据库中生成数据类型:
Field | Type | Null | Default |
---|---|---|---|
pro1 | blob | YES | NULL |
pro2 | tinytext | YES | NULL |
pro3 | mediumtext | YES | NULL |
pro4 | text | YES | NULL |
数据类型对应关系
java、MySQL、hibernate数据类型对应关系如下表所示:源码下载
本实例源码可到https://github.com/jeanhao/hibernate的下载。相关文章推荐
- hibernate5(4)实体映射注解配置[1]注解全面解析
- 【SSH进阶之路】【四】hibernate5 实体映射注解配置 【1】注解全面解析
- Hibernate基于注解方式配置来实现实体和数据库之间存在某种映射关系
- hibernate 注解方式配置实体的映射
- Hibernate实体映射配置1(java@注解方式)
- Hibernate实体映射配置1(java@注解方式)
- Hibernate 实体映射 @注解与xml 配置方式比较
- Hibernate--基于注解方式的各种映射全面总结
- Hibernate学习笔记(2)——搭建项目框架编写hibernate配置文件、实体映射文件
- hibernate中继承映射配置详细解析(二)
- hibernate中继承映射配置详细解析(三)
- Hibernate 关于实体映射常用注解
- hibernate实体映射的一些可选优化/配置
- Hibernate学习(3) (继承映射,配置文件和注解版)
- Hibernate(三)结构-配置文件-实体映射及配置文件
- Hibernate注解版关联关系映射全解析+案例
- hibernate基于注解实现映射关系的配置
- hibernate注解配置一对一映射
- hibernate中一对一映射配置详细解析(一)
- hibernate中组件映射配置详细解析