my blog my blog

Tag: hibernate
小结

 

1.button

js监听一个button的click事件,preventDefault()无效,不一定是js没写对,而是button有没有定义type=“button”,在一个form表单中,button如果不定义的话,默认就做submit处理了,所以请求直接就发出去了,监听也没用。

2.hibernate查询分页

最简单的还是hibernate的query直接在querystring中进行限定,限定setFirstResult()和setMaxResults()。比如我们要从第11条记录开始查询,那么我们可以这样子写

  1. String queryString = "select m from Profile as m where m." 
  2.                     + propertyName1 + "= ? and m." + propertyName2 + "= ?"
  3.             Query queryObject = getSession().createQuery(queryString) 
  4.                     .setFirstResult(10).setMaxResults(10); 
  5.             queryObject.setParameter(0, value1); 
  6.             queryObject.setParameter(1, value2); 
  7.             List<?> s = (List<?>) queryObject.list(); 
  8.             return s; 

这样子返回一个查询结果的list,然后迭代出来就可以了,当然,这只是查询部分的,如果要写分页的话,还需要count()等来辅助进行。

3.jquery的.on()

如果我们直接用$(document).ready(function(){})来做的话,对于使用ajax调用产生的新的dom元素,用一般的.click()等事件监听是不会起到作用的,在老版本的jQuery中使用.live()可以来进行对未来元素和现有元素的监听工作,但是新版本的建议是使用.on()来进行处理,这样子新生成的元素也就自然而然的可以监听到了。

4.jquery的遍历

遍历的话jquery的方法真的很好用,特别是选择器,很方便,.parent()、.children()、.prev()、.next()用起来非常省事儿。

5.jquery的ajax

  1. var data = {"userid" : $('input[name="userid"]').val(), 
  2. "phonenum" : $('input[name="phonenum"]').val(), 
  3. "email" : $('input[name="email"]').val() 
  4. }; 
  5. $.post('profile-update', data, function(data, textStatus, jqXHR) { 
  6. if (jqXHR.success(function() { 
  7.     alert("success"); 
  8. }) 
  9. ); 

当然,也可以直接连缀上一个.success()来处理,可以看http://api.jquery.com/jQuery.post/

6.hibernate的casecade级联

对于一对多或者多对多的情况,如果删除主表中的记录,那么以主表的主键做外键的其它表就会产生错误,导致删除失败,需要设置hibernate的配置文件casecade为delete,这样子删除的时候就可以自动把这些也删除了,当然还有其它的选项,感兴趣的话可以直接查找casecade的相关内容。

Hibernate一对多查询方法小记

 

其实,这个地方我真心不是太明白,甚至说很混乱,但是有DAO和VO就啥都当对象来吧。

比如两个表User和Profile,通过外键将其关联起来,user的主键为profile的外键,通过Hibernate生成DAO和VO,则userDAO中会有很多查询user的方法,而user的VO会多一个set类的getProfiles(),如何通过这个set来查询VO的profile信息呢,查了一些资料,算是知道怎么回事儿了。

  1. public Set getProfiles() { 
  2.         return this.profiles; 

user VO的get方法得到的是profile类型的set,也就是说这个set迭代出来的是profile对象。使用方法可以是:

  1. User user = new User(); 
  2. Set<Profile> profileset = user.getProfiles(); 
  3. Iterator<Profile> iterator = profileset.iterator(); 
  4. While(iterator.hasNext()){ 
  5.         Profile profile = iterator.next(); 
  6.         System.out.print(profile.getEmail); 

这样子就迭代出来了。

对于profile的VO也同样有public User getUser()方法,可以直接返回user VO对象。

ProfileDAO如何通过外键来查找vo对象的方法:

  1. ProfileDAO profiledao = new ProfileDAO(); 
  2. Iterator<Profile> i = profiledao.findByProperty("user.id",1).iterator(); 
  3. while(i.hasNext()){ 
  4.      Profile p = i.next(); 
  5.      System.out.print(p.getEmail); 

有了上面的互相查询的方法,这个看着仿佛是多此一举,不过也还算可用。

hibernate真心挺折腾的

 

还是比较习惯mysql直接用sql语句来查询,HQL还需要习惯习惯再习惯哇。

这两天折腾Hibernate真的挺纠结的,可能我对于对象这东西的理解太水了,先ermaster做了数据库,然后用hibernate的逆向工程生成了hibernate的对象类,然后就sb了。

映射那里仔细看下,才知道,表b外键关联表a主键的时候,并木有在表b的对象类中直接生成表a主键,而是直接把表a的对象给引入进去了。呃,解释有点儿混乱。这样子,就说设计的两个表吧,主表是main,有主键id,生成的对象类是Main,然后副表是profile,有主键profileid和外键id,生成的副表对象类是Profile。

  1. Profile p = new Profile(); 
  2. Main m = new Main(); 
  3. p.setMain (m); 
  4. session.saveOrUpdate(p) 

这样子就把一个新的profile对象存上了,但是p并没有外键属性id,因此无法用HQL的from Profile  where id = x来查询,但是其实p是有p.main的,所以要查询的时候使用from Profile where main.id = x来获得已添加的p对象。挺绕的。可能map映射改下就不用那么麻烦了。可能数据库的结构还要变,把isxxx的判断都放到main表中,明天再思考这个问题。

还有那个from xxx.class 1这个东东,明天再查查。