*.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的原因与解决方法
使用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了。