hibernate 注解详解

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
@Entity
//继承策略。另一个类继承本类,那么本类里的属性应用到另一个类中
@Inheritance (strategy = InheritanceType.JOINED )
@Table (name= "INFOM_TESTRESULT" )
public class TestResult extends IdEntity{}
 
1 @Entity (name= "EntityName" )
必须,name为可选,对应数据库中一的个表
 
2 @Table (name= "" ,catalog= "" ,schema= "" )
可选,通常和 @Entity 配合使用,只能标注在实体的 class 定义处,表示实体对应的数据库表的信息
name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog:可选,表示Catalog名称,默认为Catalog( "" ).
schema:可选,表示Schema名称,默认为Schema( "" ).
 
3 @id
必须
@id 定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx()前.
 
4 @GeneratedValue (strategy=GenerationType,generator= "" )
可选
strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4 种,分别表示让ORM框架自动选择,
根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTO
generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式.
示例:
      @Id
      @GeneratedValues (strategy=StrategyType.SEQUENCE)
      public int getPk() {
        return pk;
      }
 
5 @Basic (fetch=FetchType,optional= true )
可选
@Basic 表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为 @Basic
fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.
optional:表示该属性是否允许为 null ,默认为 true
示例:
      @Basic (optional= false )
      public String getAddress() {
        return address;
      }
 
6 @Column
可选
@Column 描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable:表示该字段是否允许为 null ,默认为 true
unique:表示该字段是否是唯一标识,默认为 false
length:表示该字段的大小,仅对String类型的字段有效
insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为 true
updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为 true .对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.
columnDefinition:表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是
 
TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用.
示例:
      @Column (name= "BIRTH" ,nullable= "false" ,columnDefinition= "DATE" )
      public String getBithday() {
        return birthday;
      }
 
7 @Transient
可选
@Transient 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient ,否则,ORM框架默认其注解为 @Basic
示例:
      //根据birth计算出age属性
      @Transient
      public int getAge() {
        return getYear( new Date()) - getYear(birth);
      }
 
8 @ManyToOne (fetch=FetchType,cascade=CascadeType)
可选
@ManyToOne 表示一个多对一的映射,该注解标注的属性通常是数据库表的外键
optional:是否允许该字段为 null ,该属性应该根据数据库表的外键约束来确定,默认为 true
fetch:表示抓取策略,默认为FetchType.EAGER
cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.
示例:
      //订单Order和用户User是一个ManyToOne的关系
      //在Order类中定义
      @ManyToOne ()
      @JoinColumn (name= "USER" )
      public User getUser() {
        return user;
      }
 
9 @JoinColumn
可选
@JoinColumn @Column 类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个 @ManyToOne 的字段.
name:该字段的名称.由于 @JoinColumn 描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.
例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键,
其默认的名称为实体User的名称+下划线+实体User的主键名称
示例:
      @ManyToOne
 
10 @OneToMany (fetch=FetchType,cascade=CascadeType)
可选
@OneToMany 描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
mappedBy:表示关联的两张表由那张表维护关系,标签一定是定义在被拥有方的,他指向拥有方;由拥有方维护关系
例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
示例:
      @OneTyMany (cascade=ALL)
@mappedBy("user")
      public List getOrders() {
        return orders;
      }
 
11 @OneToOne (fetch=FetchType,cascade=CascadeType)
可选
@OneToOne 描述一个一对一的关联
fetch:表示抓取策略,默认为FetchType.LAZY
cascade:表示级联操作策略
示例:
      @OneToOne (fetch=FetchType.LAZY)
      public Blog getBlog() {
        return blog;
      }
 
12 @ManyToMany
可选
@ManyToMany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理
targetEntity:表示多对多关联的另一个实体类的全名,例如: package .Book. class
mappedBy:表示多对多关联的另一个实体类的对应集合属性名称
@JoinTable(name = "t_task_police", joinColumns = { @JoinColumn(name = "police_id") }, inverseJoinColumns = {
@JoinColumn(name = "task_id") })表示第三张表信息
示例:
      User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book之间建立ManyToMany关联
      @Entity
      public class User {
        private List books;
        @ManyToMany (targetEntity= package .Book. class )
        public List getBooks() {
            return books;
        }
        public void setBooks(List books) {
            this .books=books;
        }
      }
 
      @Entity
      public class Book {
        private List users;
        @ManyToMany (targetEntity= package .Users. class , mappedBy= "books" )
        public List getUsers() {
            return users;
        }
        public void setUsers(List users) {
            this .users=users;
        }
      }
两个实体间相互关联的属性必须标记为 @ManyToMany ,并相互指定targetEntity属性,
需要注意的是,有且只有一个实体的 @ManyToMany 注解需要指定mappedBy属性,指向targetEntity的集合属性名称
利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联
 
13 @MappedSuperclass
可选
@MappedSuperclass 可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解
示例:
      @MappedSuperclass
      public class Employee() {
        ....
      }
 
      @Entity
      public class Engineer extends Employee {
        .....
      }
      @Entity
      public class Manager extends Employee {
        .....
      }
 
14 @Embedded
可选
@Embedded 将几个字段组合成一个类,并作为整个Entity的一个属性.
例如User包括id,name,city,street,zip属性.
我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性.
Address对象必须定义为 @Embededable
示例:
      @Embeddable
      public class Address {city,street,zip}
      @Entity
      public class User {
        @Embedded
        public Address getAddress() {
            ..........
        }
      }
 
Hibernate验证注解
注解
适用类型
说明
示例
@Pattern
String
通过正则表达式来验证字符串
@attern (regex=”[a-z]{ 6 }”)
@Length
String
验证字符串的长度
@length (min= 3 ,max= 20 )
@Email
String
验证一个Email地址是否有效
@email
@Range
Long
验证一个整型是否在有效的范围内
@Range (min= 0 ,max= 100 )
@Min
Long
验证一个整型必须不小于指定值
@Min (value= 10 )
@Max
Long
验证一个整型必须不大于指定值
@Max (value= 20 )
@Size
集合或数组
集合或数组的大小是否在指定范围内
@Size (min= 1 ,max= 255 )
以上每个注解都可能性有一个message属性,用于在验证失败后向用户返回的消息,还可以三个属性上使用多个注解


mappedBy: 
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; 
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方; 
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的; 
4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。 

下面是一个例子: 
   人跟身份证双向关联 
   在Person里面定义的注解: 
在person里面定义的注释代码   收藏代码
  1. @OneToOne(cascade = CascadeTye.ALL,optional = true)  
  2. public IDCard getIdCard(){  
  3.    return idCard;  
  4. }  


在idcard里面定义的注释代码   收藏代码
  1. @OneToOne(cascade = CascadeType.ALL,mappedBy = "idCard",optional = false)  
  2. public Person getPerson(){  
  3.    return person;  
  4. }  


多了一个mappedBy这个方法,他表示什么呢?它表示当前所在表和Person的关系是定义在Person里面的idCard这个成员上面的,他表示此表是一对一关系中的从表,也就是关系是在person表中维护的,这是最重要的。Person表是关系的维护者,有主导权,它有个外键指向IDCard。 
我们也可以让主导权在IDCard上面,也就是让他产生一个指向Person的外键,这也是可以的,但是最好让Person来维护整个关系,这样更符合我们的思维。 
我们也可以看到在Person里面的IDCard是注释optional=true,也就是说一个人是可以没有身份证的,但是一个身份证是不可以没有人的,所以在IDCard里面注释Person的时候,optional=false了,这样就可以防止一个空的身份证记录进数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值