大鱼

ejb3笔记

   1、用MyEclipse通过连接到数据库,可以生成Hibernate需要的POJO和对应的映射文件。但是我生成的hbm.xml有问题,会报错"could not load an entity"。后来找到了元凶
<class name="hbm.pojo.Misuser" table="misuser" schema="informix" catalog="zzymis">
把catalog="zzymis"去掉就OK了。

   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()方法;另外别忘了重写equals()方法
    
public boolean equals(Object object) {
        
if (object == null || !this.getClass().equals(object.getClass())) {
            
return false;
        }

        Detail other 
= (Detail)object;
        
if(other.id==null||this.id==null)
            
return false;
        
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) 
        
return false;
        
return true;
    }

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()来一个个删除。
 
   8、查询返回多个实体Bean
   1)查询(省略后的代码)
   @PersistenceContext(unitName
="crm")
   
private EntityManager em;
   
public List getUserinfoTrace(){
    
return em.createQuery("select new List(u,t)  from Userinfo u,Trace t where u.id=t.id").getResultList();
   }
   
2)读取(省略后的代码)
   List
<List> result=(List<List>)remote.getUserinfoTrace();
   
for(List obj:result){
      Userinfo userinfo
=(Userinfo)result.get(0);
      Trace trace
=(Trace)result.get(1);
      ……
   }

   9、设置ID自增
在用netbean生成的实体Bean后,需要手工加上自增注释(@GeneratedValue(strategy = GenerationType.AUTO)
例如:
@Id
@Column(name 
= "id", nullable = false)
@GeneratedValue(strategy 
= GenerationType.AUTO)
private Integer id;

   10、failed to lazily initialize a collection of role
   因为延迟加载导致的,但是我在EntityBean中使用fetch=FetchType.EAGER和FetchType.LAZY都无效,我的EntityBean是@OneToMany,最后只有在SessionBean的读取EntityBean的方法中加入:
   if(main.getDetails()!=null)
      main.getDetails().size();
   
return main;
   这样总算解决问题。

posted on 2009-10-20 12:34 大鱼 阅读(210) 评论(0)  编辑  收藏 所属分类: EJB


只有注册用户登录后才能发表评论。


网站导航: