紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok;
OK,准备工作:
首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包,如下3个jar包(共11个包):
/hibernate-annotations-3.4.0.GA/hibernate-annotations.jar (核心包)
/hibernate-annotations-3.4.0.GA/lib/ejb3-persistence.jar (jpa)
/hibernate-annotations-3.4.0.GA/lib/hibernate-commons-annotations.jar (反射所需的包)
如下图 ;
然后我们新建一个People类,如下:
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
packagecom.himi;
publicclassPeople{
privateintid;
privateStringname;
privateintage;
privateStringtitle;
privateStringbirthday;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicStringgetBirthday(){
returnbirthday;
}
publicvoidsetBirthday(Stringbirthday){
this.birthday=birthday;
}
}
最后准备工作在我们数据库中新建一个对应映射people实体类的表:(不赘述,直接看操作过程)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql>usehibernate;
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>createtablepeople(idintprimarykey,namevarchar(20),ageint,titlevarchar(20),birthdayvarchar(20));
QueryOK,0rowsaffected(0.06sec)
mysql>describepeople;
+----------+-------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+-------------+------+-----+---------+-------+
|id|int(11)|NO|PRI|NULL||
|name|varchar(20)|YES||NULL||
|age|int(11)|YES||NULL||
|title|varchar(20)|YES||NULL||
|birthday|varchar(20)|YES||NULL||
+----------+-------------+------+-----+---------+-------+
5rowsinset(0.01sec)
准备工作完成之后,那么如果通常我们会建立People.hbm.xml来对应数据库的组件和属性,然后将People在hibernate.cfg.xml配置文件中使用mapping resource声明我们有一个被加了映射,People是实体类;
但是本篇我们使用Annotation将不再创建对应的实体类对应数据库的xml,而是直接在People类中声明实体类就可以啦,修改People.java文件如下:
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
packagecom.himi;
importjavax.persistence.Entity;
importjavax.persistence.Id;
@Entity
publicclassPeople{
privateintid;
privateStringname;
privateintage;
privateStringtitle;
privateStringbirthday;
@Id
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicStringgetBirthday(){
returnbirthday;
}
publicvoidsetBirthday(Stringbirthday){
this.birthday=birthday;
}
}
仔细观察,发现只有两处有改动,就是添加了一个 @Entity 和 @Id
@Entity 表示本类是个实体类,是javax.persistence.Entity
@Id 在组件getId ()函数上约定俗成加入注解 @Id
接着我们继续在hibernate.cfg.xml配置文件中声明我们的People是个映射实体类:
1
2
3
<mappingresource="com/himi/Teacher.hbm.xml"/><!--这里是将需要mapping的文件进行再次声明-->
<mappingclass="com.himi.People"/><!--这里是声明我们的People是个映射实体类-->
上面的Teacher是上一篇介绍的,People是本篇中新建的实体类,务必注意,两种方式的区别:
一个是 mapping resource , 一个是 mapping class ;
一个路径是 com/himi/Teacher.hbm.xml 一个路径的 com.himi.People ;
最后一步,新建一个测试People的man类,名字为MainTestPeople.java:
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
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;
importcom.himi.People;
publicclassMainTestPeople{
/**
* @param args
*/
publicstaticvoidmain(String[]args){
Peoplepeople=newPeople();// 新建我们需要存储的类对象,并且设置其对象的一些属性
people.setId(2);
people.setName("Himi");
people.setAge(22);
people.setTitle("CTO");
people.setBirthday("1990-01-01");
// Configuration主要用以读取配置文件
//AnnotationConfiguration 专用于读取与Annotation相关的配置
Configurationcfg=newAnnotationConfiguration();
SessionFactorysf=cfg.configure().buildSessionFactory();
// 这里注意了,cfg.configure()读取配置文件的时候,如果你的hibernate的文件名不采用默认的“hibernate.cfg.xml”的话,那么这里传入你定义的配置文件路径
// buildSessionFactory();得到一个创建Session的工场
Sessionss=sf.openSession();// 这里的Session导入import
// org.hibernate.Session;不要使用class经典的,因为可能会过时
ss.beginTransaction();// OK,将操作放入事务中
ss.save(people);// 保存你的对象
ss.getTransaction().commit();// 得到事务并提交
ss.close();// Session关闭
sf.close();// 工厂关闭
}
}
仔细以上观看代码,与上一篇测试我们的Teacher 一致,唯一要注意的是 Configuration的实例:
不使用Annotation实例配置对象,我们采用如下获取Configuration:
Configuration cfg = new Configuration();
使用Annotation时,我们采用如下获取Configuration:
Configuration cfg = new AnnotationConfiguration();
OK, 右键MainTestPeople, run as -> Java application;
运行结果:
1
Hibernate:insertintoPeople(age,birthday,name,title,id)values(?,?,?,?,?)
ok,监测一下数据库的People表内是否已经成功插入了信息:
1
2
3
4
5
6
7
8
mysql>select *frompeople;
+----+------+------+-------+------------+
|id|name|age|title|birthday|
+----+------+------+-------+------------+
|1|Himi|23|CTO|1990-01-01|
|2|Himi|22|CTO|1990-01-01|
+----+------+------+-------+------------+
2rowsinset(0.00sec)
没问题。本篇介绍Annotation第一个项目就到这里,比较eazy,而且Annotation使用起来相当方便!