Hibernate_EJB笔记

来源:互联网 发布:linux oracle 配置监听 编辑:程序博客网 时间:2024/04/30 02:24

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()来一个个删除。

原创粉丝点击