一.关于inverse维护关系
起作用: 1:N or N:M
1:N时,把多的一端inverse设为false(false为自己控制),好比让毛老头记住全国人民不可能,而全国人民记住毛老头比较轻松.
N:M时,随便一端设为false即可,另一端true.
二.关于<one-to-one>中的constrained
当constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,
它通过<one-to-one>关联的实体可能存在,也可能不存在.
三.很有意思的绑定参数方法
List names = new ArrayList(); names.add("Izi"); names.add("Fritz"); Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)"); q.setParameterList("namesList", names); List cats = q.list(); Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size"); q.setProperties(fooBean); // fooBean包含方法getName()与getSize() List foos = q.list();
四.使用原生SQL的查询
注意: 如果你选择使用Hibernate的API, 你必须把SQL别名用大括号包围起来:
List cats = session.createSQLQuery( "SELECT {cat}.ID AS {cat.id}, {cat}.SEX AS {cat.sex}, " + "{cat}.MATE AS {cat.mate}, {cat}.SUBCLASS AS {cat.class}, ... " + "FROM CAT {cat} WHERE ROWNUM<10", "cat", Cat.class ).list()
五.session.flush都在什么时候执行
在某些查询执行之前
在调用org.hibernate.Transaction.commit()的时候
在调用Session.flush()的时候
六.uniqueResult关键字
以前写代码,总免不了编写登陆部分。在获取user的时候,只可能返回一个user实例,或者为null。以前使用以下方法实现。
public User get(String id){ Session session=HibernateUtil.getSessionFactory().openSession(); String hql="from User u where u.id = ?"; List list=session.createQuery(hql).setString(0, id).list(); if (list.size()==1){ return (User)list.get(0); }else{ return null; } }
发现uniqueResult后:
public User get(String id){ Session session=HibernateUtil.getSessionFactory().openSession(); String hql="from User u where u.id=?"; return (User)session.createQuery(hql).setString(0,id).uniqueResult(); }