天天看点

【hibernate框架】各种问题用注解Annotation和mxl配置的解决

1.表名和类名不同,对表名进行配置

a)annotation:

一般说来,表名一定要和实体类的名称一样。

但如果表明和实体类名不一致,可以用以下两种方式指明实体类对应的表名:

1.annotation情况下:

运行测试类时自动创建了表(可不会自动创建数据库哦)

自动创建表是由hibernate.cfg.xml中的这个配置语句决定的:

b)xml:

在实体类的配置文件(如student.hbm.xml)中的class标签里写 table="stu"指定表名:

2.字段名和属性不同

a)字段名的get方法上的注解默认为@basic,不用写。但是如果字段名和表里属性值不一样的时候,需要用@column来解决,name指定插入到数据库的属性名(如果没有,hibernate会自动创建)

b)xml中不用写column(如果你非要配,就是这样):

3.不需要psersistence的字段

a)annotation:@transient

在javabean中这样写

就不会对yourwifename进行持久化,也就不会在数据库中创建这个属性

b)xml不写

4.映射日期与时间类型,指定时间精度

a)annotation:@temporal

在teacher的javabean中加入date字段生成属性:

数据库会生成一个datetime类型的属性

在测试类中添加生日(为当前日期):

t.setbrithday(new date());

会在数据库中看到存入的数值:

2014-12-03 15:05:31

那么如果只想要日期,或者只想要时间,就需要对时间进行精确定位,方法为:

数据库的相应属性就会改成date类型,只会存储日期,不存时间

b)xml:指定type

5.映射枚举类型

a)@enumerated

创建了一个枚举类型,用来存放职称的等级。

在javabean创建相应字段和属性:

因为是特殊类型,hibernate无法向数据库相应表中构建正确类型的属性,所以要重新指定字段的类型:

指定为string:

指定为integer:

b)xml:非常麻烦

6.字段映射的位置(field或者get方法):

a)best practice:保持field和get set方法的一致

字段映射的位置(如@id)可以放在field上面,也可以放在get方法上

例如放在get方法上:

放在field上:

一般工作的写法,是放在field上,这样看起来比较集中。但是,这种写法实际上破坏了java的面向对象的封装性。

原因是,字段一般说是private的。如果你在私有的上面写了注解的话,就相当于hibernate直接去访问你私有的成员变量(用反射机制)。

从设计上来讲,不推荐用放在field上的写法,因为们把成员变量设成私有的就是不想让外部类去直接拿我们的数据,这样不合适。

转载请注明出处:http://blog.csdn.net/acmman