hibernate使用笔记

来源:互联网 发布:sql r2是什么意识 编辑:程序博客网 时间:2024/04/29 03:59
*.hbm.xml id的三种状态

自增:<generator class= "identity" />
数字ID: <generator class="increment"/>
字符ID:<generator class="uuid"/>
自己赋值:<generator class="assigned"/>

获得最大ID值: 

使用Hibernate获取最大值(max)的三种方法 

获取最大值的三种方法:

1. 使用 hsql
Integer c = (Integer)dbt.getSession().createQuery("select max(a.ArticleId) from Article a " ).uniqueResult();
System.out.println(c);
注意:要加上别名“a”, a.ArticleId注意大小写! 否则会出现"无法解释的属性"错误!

2. 使用native sql
sql = "select max(articleid) maxid from ljarticle";
maxId = (Integer)(session.createSQLQuery(sql).addScalar("maxId", Hibernate.INTEGER) ).uniqueResult();
注意:要加上“maxid”标量

3. 使用criteria
Integer c = (Integer)dbt.getSession().createCriteria(Article.class)
.setProjection( Projections.projectionList().add(Projections.max("ArticleId " ) ) )
.uniqueResult() ;


同样要注意ArticleId是区分大小写的! 

          星级算法:
          /**
             * 星级换算 1 -5满星 和1.5半星
             * @param args
             */
             public float starLevel(float starLevel){
                         int y=( int)(starLevel*10)%10;
                                     if(y<5){
                                                starLevel=( int)starLevel;
                                    } else{
                                                starLevel=( float)(( int)starLevel+0.5);
                                    }
                         return starLevel;
             }
          





 illegal attempt to dereference collection 

    

首先说一句:是版本的问题!

在多对多或者多对一,从一中查找多中查询某些语句时容易出现

我写的hql为:

from Department as d where d.employees.name='Tom';

运行时出现异常:org.hibernate.QueryException: illegal attempt to dereference collection

是因为:在上面的HQL语句中,Department的关联实体employees是一个集合,而不直接是一个Employee实体。

在Hibernate3.2.2以前的版本,Hibernate会对关联实体自动使用隐式的inner join,

也就是说如下SQL语句不会有任何问题 :from Department as d where d.employees.name='Tom';

从Hibernate3.2.3以后,Hibernate改变了这种隐式的inner join的策略

对于如下这条语句:

from Department as d where d.employees.name='Tom';

如果employees是普通组件属性,或单个的关联实体,则Hibernate会自动生成隐式的inner join

如果myEvents是也一个集合,那么对不起!系统将会出现 org.hibernate.QueryException: illegal attempt to dereference collection异常。
据Hibernate官方说法: 
这样可以让这使得隐含关联更具确定性(原文:This makes implicit joins more deterministic )。

推荐这样写:

from Department as d inner join fetch d.employees e where e.name='Tom';








org.hibernate.NonUniqueObjectException的原因与解决方法

01 四月 2011 | J2EE | Tags: hibernate, NonUniqueObjectException

使用hibernate更新对象时,出现如下错误:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[com.fatkun.dao.hibernate.User#12]

原因

在同一个session内,如果已经有一个对象已经是持久化状态(load进来等),现在构造一个新的PO,和前一个持久化对象拥有相同的持久化标识(identifier),在update的时候,就会抛这个错误。
举个例子(伪代码):

User user1 = session.load(1);User user2 = new User();user2.setId(1);//此时ID和user1一样user2.setUsername("fatkun");session.update(user2);//这里会抛出错误

解决方法


1.不要重新new一个对象,使用load的对象对他进行更改值。
例如上面例子直接对user1操作,最后更新user1
2.如果是hibernate3以上,可以使用session.merge()方法
3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。


0 0