Hibernate可以解包导致意外行为吗?

时间:2015-09-16 10:45:59

标签: hibernate jpa

我需要在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):

为什么会出现这种行为?

谢谢!

1 个答案:

答案 0 :(得分:0)

不,不应该存在任何“隐藏”问题。但是,不要忘记关闭手动打开的语句,结果集和任何其他可关闭资源。

无论如何,您应该倾向于使用本机查询(entityManager.createNativeQuery)而不是直接The multi-part identifier "u.vdsDomain" could not be bound 操作(以避免需要手动管理连接资源的生命周期,保持在JPA中等)。

关于在 DDL / DML操作之后有时会收到的错误,大多数数据库implicitly commit是在任何DDL操作之前和之后的活动事务。