我需要在ejb 3服务方法中执行纯SQL查询(例如,我需要从一些技术oracle表中获取数据或执行存储过程等),我的策略如下:
获取普通的jdbc连接
private Connection getConnection() {
org.hibernate.Session hibernateSession = entityManager.unwrap(org.hibernate.Session.class);
final Connection[] connections = new Connection[1];
hibernateSession.doWork(connection -> connections[0] = connection);
return connections[0];
}
使用连接:
public String doStuff() throws MyException{
SomeKindOfManagedObject o = new SomeKindOfManagedObject()
entityManager.persist(o)
//business logic
//modification to object "o"
final Connection connection = getConnection();
String query = "select * from all_tab_partitions where table_name = '"+ MY_TABLE +"'";
try (final Statement statement = connection.createStatement()) {
final ResultSet rs = statement.executeQuery(query);
doSomeKindOfStuff(rs);
}catch(Exception e){
logger.log(e);
throw new MyException(e);
}
entityManager.merge(o);
}
是否存在某些与解包和使用普通jdbc连接相关的潜在隐藏问题?特别限制交易管理?
像我一样混合ORM操作和普通JDBC查询是否有问题?
我注意到,在某些情况下,在DDL / DML操作之后调用em.merge(object)会产生一个
javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context):
为什么会出现这种行为?
谢谢!
答案 0 :(得分:0)
不,不应该存在任何“隐藏”问题。但是,不要忘记关闭手动打开的语句,结果集和任何其他可关闭资源。
无论如何,您应该倾向于使用本机查询(entityManager.createNativeQuery
)而不是直接The multi-part identifier "u.vdsDomain" could not be bound
操作(以避免需要手动管理连接资源的生命周期,保持在JPA中等)。
关于在 DDL / DML操作之后有时会收到的错误,大多数数据库implicitly commit是在任何DDL操作之前和之后的活动事务。