对数据库的操作无非就是CRUD(Create、Read、Update、Delete)四种操作了,昨天弄了R(Read)操作,基本上能实现我所期望的功能了。回想一下数据库的操作,貌似就R操作麻烦点,因为它可细分为很多操作,比如单条记录的查询、分页查询、全部查询等。而其他的三种操作,方法较单一,代码重用率比较高。
对于Create操作,第一要保证,插入的数据都符合数据库表的约束条件,特别是在多对一的外键约束下,比如:新闻和新闻类型是多对一的关系,在插入新闻信息时,由于MyEclipse自动生成的News.hbm.xml配置文件中新闻类型号typeId是以新闻类型持久类对象存在,而不是简单的以一个Integer/int对象存在,并且此对象不能为空,因为一则新闻必须指定其所属的类型,所以,我们在插入新闻信息时,就必须为新闻类对象(处于自由状态的对象)的newstype属性指定一个实例,其中news.newstype.id必须指定其一个合法(存在)的新闻类型id号,而newstype的其他属性在没有设置级联关系的情况下,可以不赋值,若有级联关系,则得按照各属性的约束赋值了。
Update操作和Create操作貌似完全一致了,只是数据源有点不同而已。呵呵。
Delete操作时,删除的必须是一持久对象,也就是说,在删除之前,必须先将其加载(get方法)为一持久对象,然后在用session.delete(Object)删除此对象,而不能简单的像SQL的Delete语句那样,只指定要删除对象的主键值。这样做有一个很明显的优势,可以很方便的实现级联操作。当然要结合延迟加载机制,才可以得到最佳的效果。在配置文件里将lazy设为true,当需要级联操作的地方调用Hibernate.initialize(Obejct)方法强制加载集合属性等,再执行级联操作。
今天还发现MyEclipse自动生成的HibernateSessionFactory类的closeSession方法有一处可以改善的地方。代码如下:
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
if(session.isOpen())
session.close();
}
}
再关闭session之前先判断其是否已经关闭,若没关闭则执行关闭操作,若已关闭了则跳过。这样是不是更好点呢,不过也有可能引来一些极其隐蔽的错误。呵呵。
要熟练Hibernate是一长期工程啊,不过这两天所弄的这些东西,基本上能满足一般需求了,至少升级我现有的这个网站是可以了。哈哈。