坚持每天写博文,积累下开发中的点点滴滴
- 思考:hibernate什么时候会调set方法什么时候会调get方法?
保存时需要传入数据的时候会调用get方法来获取字段值,查询出数据以后装回到domain对象时使用。 hibernate不需要考虑get/set方法的可见性
即,hibernate能够调用私有的set/get方法<hibernate-mapping>
中有一个package属性,用来定义domain的包
<hibernate-mapping package="text">
<class name="User" table="user">
等价于
<hibernate-mapping>
<class name="text.User" table="user">
注意两行都写全包名也不会报错,因为hibernate会先找 <class name="text.User" table="user">中验证,如果没有再添加 <hibernate-mapping package="text">
但是不能直接在包里写完全,即<hibernate-mapping package="text.User">是错误的
- <property name="user_name" column="user_name"/>里的type不需要配,并且name属性需要避免作为数据库的关键字,否则数据库不能建表。
- 关于日期格式,默认是年月日时分秒,可以设置属性来格式化
//默认是年月日时分秒,一般来说只有日期会配置type
<property name="dateText" type="date"/>//年月日
<property name="dateText" type="time"/>//时分秒
- hibernate映射文件默认包含所有字段,比如我在使用保存方法时,即使某个属性是空,sql语句也会包含这个属性。如果我想要某个属性不被包含,可以配一个属性
//inset属性默认是true,false为不包含(保存操作)
//update属性默认是true,false为不包含(修改操作)
//inset很少用,update对那些意境填写不得修改的属性(如创建时间,身份证等)
<property name="user_name" column="user_name" inset="false" update="false"/>
- 问题
:不同包里面有两个同名的domain对象,映射文件编译报错,此时应该修改其中一个auto-import=”false”<hibernate-mapping package="text" auto-import="false">
- 注意:此时我写sql进行查询:
`String hql = "SELECT o FROM User o";
Query query = session.createQuery(hql);
System.out.println(query.list());`
此时查询的是auto-import=”true”对应的User,此时应该使用全类名:
String hql = "SELECT o FROM text.User o";
除了这样直接写全类名,也可以在映射文件中给此类设置一个别名,然后查询别名。
映射文件:
<hibernate-mapping package="text" auto-import="false">
<import class="text.User" rename="User2"/>
sql:String hql = "SELECT o FROM User2 o";