JBSEAM自带的例子seamSpace从JBoss AS+Hibernate移到Geronimo+OpenJPA上的总结

seamSpace是Seam自带的一个演示Seam的安全模块的一个demo,里面用到了好多安全相关的操作,由于项目框架选择的原因,想把Seam和Geronimo、OpenJpa集成起来。下面就来看看集成他们的具体步骤。

1.JBoss到Geronimo的移植。

  ①JNDI的变更:使用JBoss服务器时,有很多默认的配置,但Geronimo和JBoss的默认的JNDI配置是不一样的,工程中的EJB BEAN、数据源以及Seam本身的一些组件,都需要显式定义它们的JNDI。
  ②去除JBoss的一些专用配置,并添加Geronimo的一些专用配置
  ③数据源定义配置移到persistent.xml文件中

2.Hibernate到OpenJpa

①修改persistent.xml中的persistent provider为OpenJpa
②在component.xml中添加org.jboss.seam.persistence.persistenceProvider的定义,默认是Hibernate,需要新建一个OpenJpaPersistenceProvider,如下

public class OpenJpaPersistenceProvider extends PersistenceProvider {
  Log log = Logging.getLog(OpenJpaPersistenceProvider.class);

  @Override
  public void setFlushModeManual(EntityManager entityManager) {
    // see also https://jira.jboss.org/jira/browse/JBSEAM-3030
    log.warn("setFlushModeManual is not supported by OpenJPA");
  }
}
3.seamSpace的移植

  ①修改seam使用的JNDI

 
 <core:init debug="true" jndi-pattern="java:comp/env/#{ejbName}Local"/>

  ②规范化seam安全框架里的JPQL语句,以及seamSpace里的JPQL语句
  ③修改所有的使用:member作为命名参数的地方,把member改为其他字符,member是Openjpa的一个关键字。
  ④对通过entityManager查询List结果需进行操作的,需把list拷贝一个出来再做操作,OpenJpa不让对他查询出的结果进行类似remove、sort的操作,不过这样可能导致list下的某些对象不能加载
   public List<String> listRoles()
   {     
      return new 
	        java.util.LinkedList( lookupEntityManager().createQuery(
            "select r." + roleNameProperty.getName() + " from " + roleClass.getName() + " r").getResultList());
   }

⑤ drl里相关的实体对象的加载方式修改为fetch = FetchType.EAGER

4.总结

总体上移植的还比较顺利,可能SEAM与Hibernate耦合的比较深,Seam需要它的一些jar包,另外就是OpenJpa现在还很不成熟,好多地方会莫名的出点错,版本间的差别也比较大。这个还需大家多多测测。

你可能感兴趣的:(Hibernate,框架,xml,jboss,seam)