在EJB3无状态bean中执行JDBC查询

在EJB3无状态bean中执行JDBC查询,jdbc,ejb-3.0,facade,Jdbc,Ejb 3.0,Facade,我正在为我的服务EJB3无状态bean使用以下模式。基本上,每个数据库表都是通过一个DAO/facade类型类(本身也是一个无状态的EJB3bean)公开的 然后,我假设的AServicebean被注入它需要使用的各种数据库表的外观。但是,在外观中没有提供某些更复杂的逻辑(仅用于一个表上的CRUD类型操作)。出于这个原因,我还直接注入了数据源,因此我可以使用JDBC进行更复杂的查询 我的方法中是否有任何明显或微妙的反模式/警告 @Stateless @Local (IAService.ILo

我正在为我的服务EJB3无状态bean使用以下模式。基本上,每个数据库表都是通过一个DAO/facade类型类(本身也是一个无状态的EJB3bean)公开的

然后,我假设的AServicebean被注入它需要使用的各种数据库表的外观。但是,在外观中没有提供某些更复杂的逻辑(仅用于一个表上的CRUD类型操作)。出于这个原因,我还直接注入了数据源,因此我可以使用JDBC进行更复杂的查询

我的方法中是否有任何明显或微妙的反模式/警告

 @Stateless
 @Local (IAService.ILocal.class)
 @Remote(IAService.IRemote.class)
 public class AService implements IAService.ILocal, IAService.IRemote{

     @PersistenceContext(unitName = "cashflowPU")
     private EntityManager em;

    // inject CRUD facades for straightforward operations
    @EJB
    private ITableAFacade.ILocal tgAFacade;
    ...

    // inject the data source for non-straightforward operations that require JDBC
    @Resource(mappedName="java:/cashflow") DataSource dataSource;


    public BigDecimal methodThatNeedsComplexQuery (...params) throws SQLException {
        Connection conn = null;
        BigDecimal retValue = null;
        try {
             conn = dataSource.getConnection();
             PreparedStatement pstm = ...
             ResultSet rs = pstm.executeQuery(); ...
             while (rs.next()) ...
        } finally {
             conn.close();
             return retValue;
        }
    }                                                      
}                                                          

您还可以使用EntityMangaer.createNativeQuery(字符串sqlString),而不是注入数据源