使用和扩展 JOOQ 生成的带有注入数据源的 DAO?
Using and extending JOOQ generated DAOs with injected DataSource?
我是 JOOQ 的新手...以下代码似乎适用于 WildFly 22,但我不确定这是否是最好的处理方式。将 WF DataSource 注入 JOOQ DAO(我的扩展 DAO)的首选方法是什么?有没有办法避免执行“.get()”。在下面的服务中,只留下 @Resource(...) 等与 MyCompanyDAO 相关的连接在内部处理?
换句话说:companyDAO.get().fetchOneById(id) 与 companyDAO.fetchOneById(id)
@Stateless
public class CompanyService extends DefaultCompanyService {
@Inject
private MyCompanyDAO companyDAO;
public Company find(Integer id) {
return companyDAO.get().fetchOneById(id);
}
}
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
private MyConnectionProvider cp;
public CompanyDAO get() { // since cannot use @Resource in dao constructor
this.configuration().set(cp).set(SQLDialect.POSTGRES);
return this;
}
// custom code here
}
public class CompanyDao extends DAOImpl<CompanyRecord, tables.pojos.Company, Integer> {
// jooq generated code here
}
@Stateless
@LocalBean
public class MyConnectionProvider implements ConnectionProvider {
@Resource(lookup = "java:/MyDS")
private DataSource dataSource;
@Override
public Connection acquire() throws DataAccessException {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new DataAccessException("Could not acquire connection.", e);
}
}
@Override
public void release(Connection connection) throws DataAccessException {
try {
connection.close();
} catch (SQLException e) {
throw new DataAccessException("Could not release connection.", e);
}
}
}
将 MyCompanyDAO
的初始化逻辑放在 @PostConstruct
方法中。
@PostConstruct
public void init() {
this.configuration().set(cp).set(SQLDialect.POSTGRES);
}
这样,您就不需要调用 get:
@Inject
private MyCompanyDAO companyDAO;
public Company find(Integer id) {
return companyDAO.fetchOneById(id);
}
改用构造函数注入怎么样?生成的 DAO
类 提供了一个构造函数,它接受一个 Configuration
正是为此:
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
public MyCompanyDAO (Configuration configuration) {
super(configuration);
}
}
如果由于某种原因您无法注入整个配置(我建议这样做),您仍然可以注入 ConnectionProvider
:
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
public MyCompanyDAO (MyConnectionProvider cp) {
super(DSL.using(cp, SQLDialect.POSTGRES));
}
}
我是 JOOQ 的新手...以下代码似乎适用于 WildFly 22,但我不确定这是否是最好的处理方式。将 WF DataSource 注入 JOOQ DAO(我的扩展 DAO)的首选方法是什么?有没有办法避免执行“.get()”。在下面的服务中,只留下 @Resource(...) 等与 MyCompanyDAO 相关的连接在内部处理?
换句话说:companyDAO.get().fetchOneById(id) 与 companyDAO.fetchOneById(id)
@Stateless
public class CompanyService extends DefaultCompanyService {
@Inject
private MyCompanyDAO companyDAO;
public Company find(Integer id) {
return companyDAO.get().fetchOneById(id);
}
}
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
private MyConnectionProvider cp;
public CompanyDAO get() { // since cannot use @Resource in dao constructor
this.configuration().set(cp).set(SQLDialect.POSTGRES);
return this;
}
// custom code here
}
public class CompanyDao extends DAOImpl<CompanyRecord, tables.pojos.Company, Integer> {
// jooq generated code here
}
@Stateless
@LocalBean
public class MyConnectionProvider implements ConnectionProvider {
@Resource(lookup = "java:/MyDS")
private DataSource dataSource;
@Override
public Connection acquire() throws DataAccessException {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new DataAccessException("Could not acquire connection.", e);
}
}
@Override
public void release(Connection connection) throws DataAccessException {
try {
connection.close();
} catch (SQLException e) {
throw new DataAccessException("Could not release connection.", e);
}
}
}
将 MyCompanyDAO
的初始化逻辑放在 @PostConstruct
方法中。
@PostConstruct
public void init() {
this.configuration().set(cp).set(SQLDialect.POSTGRES);
}
这样,您就不需要调用 get:
@Inject
private MyCompanyDAO companyDAO;
public Company find(Integer id) {
return companyDAO.fetchOneById(id);
}
改用构造函数注入怎么样?生成的 DAO
类 提供了一个构造函数,它接受一个 Configuration
正是为此:
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
public MyCompanyDAO (Configuration configuration) {
super(configuration);
}
}
如果由于某种原因您无法注入整个配置(我建议这样做),您仍然可以注入 ConnectionProvider
:
@Stateless
public class MyCompanyDAO extends CompanyDao {
@Inject
public MyCompanyDAO (MyConnectionProvider cp) {
super(DSL.using(cp, SQLDialect.POSTGRES));
}
}