Liny_@NotePad

沉迷ACG中

Hibernate 懒加载

Lazy的概念就是只有在真正使用对象时,才会去创建。
对hibernate而言,就是真正加载时才发出加载Sql语句。 延迟加载机制是为了避免一些无谓的性能开销而提出来的。

重点牢记
1.Load支持延迟加载,get不支持延迟加载。
2.lazy的生命周期与session相同,lazy加载必须依赖于session一直开启。
3.Hibernate lazy属性,在3.x后是默认打开的,在以前版本中默认是关闭的。
4.hibernate通过cjlib实现代理。

Hibernate 使用字符串作为主键

小笔记下,生成ORM的时候类型使用assigned即可。

a different object with the same identifier value was already associated with the session

javax.servlet.ServletException: org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session

错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

Spring+Hibernate查询复合主键报错

原本在C/S项目中的测试通过,但是在转换到B/S的时候就报错了,

复合主键的查询代码是

  1.          /**
  2.          * 获得指定编号的种别
  3.          * @param sortID
  4.          * @param category
  5.          * @return
  6.          */
  7.         public InstrumentSort getSortById(String sortID, InstrumentCategory category) {
  8.                 InstrumentSort sort = new InstrumentSort();
  9.                 sort.setSortId(sortID);
  10.                 sort.setInstrumentCategory(category);
  11.                 return (InstrumentSort) this.getHibernateTemplate().getSessionFactory().getCurrentSession().load(InstrumentSort.class, sort);   
  12.         }

其中sortID和category是InstrumentSort的主键。

报的错误是org.hibernate.LazyInitializationException: could not initialize proxy - no Session

于是在InstrumentSort.hbm.xml的<hibernate-mapping>里加上了 default-lazy="false" 属性 就成功了 囧rz 原因为啥不知

eclipse的hibernate插件。。

software install里的直接安装地址:http://download.jboss.org/jbosstools/updates/stable/

是JBoss的Tools,可以在里面找到Hibernate Tools,

或直接下载:https://www.hibernate.org/6.html去下载 自行配置插件

Hibernate的set排序

在对应的hbm.xml文件中所需要修改的set标签加上order-by属性即可~
eg.

<set name="courses" inverse="true" order-by="weekday asc, period asc, roomId asc">
    <key>
       <column name="classID" not-null="true" unique="true" />
    </key>
    <one-to-many class="org.banana.mms.model.Course" />
</set>

当然,order-by里用的是中间表的字段~

Hibernate 子查询

假设现在有一个Clazz类表示班级,一个Course类表示课程,一个Room表示教室,
Clazz-Room 1:n
Clazz-Course 1:n

要查询指定时间week和指定教室编号(都存储在course表中)的班级只需

FROM Clazz clazz WHERE ( SELECT count(*) FROM clazz.courses WHERE weekday = " + myWeekday + " AND roomId = " + myRoomId + ")>0 )

注意要给Clazz一个别名~这样才能在子查询中使用。