按位与运算(&)在许多数据库中都是支持的,遗憾的是,Hibernate 3在HQL中不支持&运算,如果你写了如下的HQL:
则Hibernate报错:exception: unexpected char: '&'.
如何解决此问题?方法是利用Hibernate支持的自定义SQLFunction,定义一个bitand(a,b)的SQLFunction,然后,自己写一个解释器,生成a & b的SQL语句。
要实现一个自定义的SQLFunction,必须实现SQLFunction接口:
复制内容到剪贴板 程序代码
where a.id & :mask = :target
则Hibernate报错:exception: unexpected char: '&'.
如何解决此问题?方法是利用Hibernate支持的自定义SQLFunction,定义一个bitand(a,b)的SQLFunction,然后,自己写一个解释器,生成a & b的SQL语句。
要实现一个自定义的SQLFunction,必须实现SQLFunction接口:
Tags: 运算 hibernate3 SQL
Hibernate升级到3以后,我发现原有的HibernateException异常被Hibernate自动处理了,于是把try/catch/finally去掉,结果就出了这么个异常,原因很简单,看代码:
catch块中的代码应该是:
否则通不过编译!应为抛出了异常后不能再有其它语句.
catch块中的代码应该是:
复制内容到剪贴板 程序代码
if (tx!=null) {
tx.rollback();
}
throw e;
tx.rollback();
}
throw e;
否则通不过编译!应为抛出了异常后不能再有其它语句.
Tags: Transaction started hibernate3
今天把孙MM的<<精通Hibernate>>里第五章的代码跑了一遍,有一个方法怎么也过不去:
复制内容到剪贴板 程序代码
public void deleteAllObjects(String className) throws Exception{
// Ask for a session using the JDBC information we've configured
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete("from " +className);
// We're done; make our changes permanent
// Ask for a session using the JDBC information we've configured
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete("from " +className);
// We're done; make our changes permanent
Tags: hibernate3
关于load()和get()方式的最新认识,在hibernate3中load取出的值只是一个代理对象,那里除了id之外,没有任何值,比如说下面这段代码:
当使用get()方式时,正常.当使用load()方法时,抛出异常:
深入分析:
在Hibernate中通过主键id取得数据对象有两种方法:
1. get()方法
复制内容到剪贴板 程序代码
UserStatus status = s1.getStatus(Integer.parseInt(statId));
log.info("测试:"+status.getName());
log.info("测试:"+status.getName());
当使用get()方式时,正常.当使用load()方法时,抛出异常:
引用内容
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
深入分析:
在Hibernate中通过主键id取得数据对象有两种方法:
1. get()方法
Tags: hibernate3 load get
hibernate2与hibanete3在lazy的默认值上有区别:2中默认为lazy="false".而三中默认为proxy,我们可以把它看作是true.
异常:
原因:hibernate3 many-to-one的默认选项是 lazy = "proxy"
解决方法:<many-to-one> & <set> 中设置 lazy="false"
异常:
复制内容到剪贴板 程序代码
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
原因:hibernate3 many-to-one的默认选项是 lazy = "proxy"
解决方法:<many-to-one> & <set> 中设置 lazy="false"
Tags: hibernate3
把程序从hibernate2升级为hibernate3时,遇到的错误.在这里做一小节:
一:INFO [STDOUT] 03:30:37,640 ERROR [DTDEntityResolver] Don't use old DTDs, read the Hibernate 3.x Migration Guide!
程序里原来的映射文件(.hbm.xml)原来以:
开头。
需要修改为:
一:INFO [STDOUT] 03:30:37,640 ERROR [DTDEntityResolver] Don't use old DTDs, read the Hibernate 3.x Migration Guide!
程序里原来的映射文件(.hbm.xml)原来以:
复制内容到剪贴板 程序代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
需要修改为:
复制内容到剪贴板 程序代码
<?xml version="1.0" encoding="utf-8"?>
Tags: hibernate3