我对我的服务 EJB3 无状态bean使用以下模式。基本上,每个数据库表都通过 DAO / facade 类型类(本身也是无状态 EJB3 bean)公开。
然后我的假设 AService bean注入了它需要使用的各种数据库表的外观。但是,外观中没有提供某些更复杂的逻辑或逻辑(它们在一个表上用于CRUD类型操作)。出于这个原因,我也直接注入了 DataSource ,因此我可以使用 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;
}
}
}
答案 0 :(得分:2)
您也可以使用EntityMangaer.createNativeQuery(String sqlString)而不是注入数据源。