1、用MyEclipse生成的×.hbm.xml有问题
例如:<class name="hbm.pojo.Misuser" table="misuser" schema="informix" catalog=”zzymis”>
需要把catalog=”zzymis”去掉不然会报错“could not load an entity”;
2、Hibrenate保存数据失败
如果忘记提交事务会导致数据保存或者更新失败,正确代码如下:
HibernateSessionFactory. getSession().beginTransaction();
new hbm.pojo.StudySubjectDAO().merge(subject);
HibernateSessionFactory. getSession().flush();
HibernateSessionFactory. getSession().getTransaction().commit();
3、Hibernate一对多的配置问题
最好使用双向关联(假设Main->Detail) 1)Main.java中加入: private Set< Detail > detail=new HashSet(); 然后加入get()和set()方法; 2)Detail.java中加入: private Main main; 然后加入get()和set()方法; 3)Main.hbm.xml中加入: <set name="detail" inverse="true" cascade="all"> <key column="mainId"></key> <one-to-many class=" Detail"/> </set> 4)Detail.hbm.xml中加入: <many-to-one name=" main " class=" Main" column=" mainId"> </many-to-one> 同时把mainId对应的<property>……</property>删掉 5)操作: 双向设置:(调用setMain()setDetail()) |
4、EJB中的getSingleResult()方法
查找返回一个结果,是唯一的一个结果,当getSingleResult()个方法被调用时执行查询。如果没有结果返回,这个方法将会抛出javax.persistence.EntityNotFoundException运行异常.如果找到多于一个结果, javax.persistence.NonUniqueResultException异常将会在运行期间抛出.因为这两个异常都是RuntimeException,例子中的代码不需要完整的try/catch块.
5、Hibernate3的解决中文查询问题
如果直接把查询的参数放到sql语句中是查不出来的,比如:
Query query=em.createQuery("select u from User u where u.name like '%"+myName+"%'");
可以使用占位符或者设置参数的方法来查询,例如:
1)Query query=em.createQuery("select u from User u where u.name like ? ");
query.setString(0,"%"+myName+"%");
2)Query query=em.createQuery("select u from User u where u.name like :name");
query.setString("name","%"+myName+"%");
6、Like的其他用法(正则)
like '_heryl' :搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。 like '[CK]ars[eo]n' :搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。 like '[M-Z]inger' :搜索以字符串 inger 结尾、以从M到Z的任何单个字母开头的所有名称如 。 like 'M[^c]%' :搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如 MacFeather)。 |
7、一对多(one-to-many)删除不掉
比如Main-to-Detail是one-to-many关系,在新增的时候可以通过persistMain()同时把多个Detail插入数据库,但是如果想删除某个Main中的某几个Detail时,好像通过mergeMain()是无法做到的,通过mergeMain()可以更新Main的属性,但是没办法删除相应的Detail,至少我是没办法做到。这时,我一把都是写个方法单独来删除Detail,例如deleteDetailById()来一个个删除。