Get hold of a JDBC Connection object from a Stateless Bean

后端 未结 7 1821
孤街浪徒
孤街浪徒 2020-12-09 18:43

In a Stateless Session Bean an EntityManager is injected but I would like to get hold of a Connection object in order to invoke a DB Procedure. Is

相关标签:
7条回答
  • 2020-12-09 19:06

    Below is the code that worked for me. We use jpa 1.0, Apache openjpa implementation.

    import java.sql.Connection;
    import org.apache.openjpa.persistence.OpenJPAEntityManager;
    import org.apache.openjpa.persistence.OpenJPAPersistence;
    
    
    
    public final class MsSqlDaoFactory {
    
    
       public static final Connection getConnection(final EntityManager entityManager) {
              OpenJPAEntityManager openJPAEntityManager = OpenJPAPersistence.cast(entityManager);
              Connection connection = (Connection) openJPAEntityManager.getConnection();
              return connection;
    
        }
    
    }
    
    0 讨论(0)
  • 2020-12-09 19:10

    In Hibernate, the solution posted by skaffman resulted in the following error message:

    Hibernate cannot unwrap class org.hsqldb.Session

    I did get it to work using SessionImpl rather than Session:

    Connection connection = entityManager().unwrap(SessionImpl.class).connection();
    

    An example of solving the problem using Session.doWork() is as follows:

    private void executeNative(final String query) {
        Session session = entityManager.unwrap(Session.class);
        session.doWork(new Work() {
    
            @Override
            public void execute(Connection connection) throws SQLException {
                Statement s = null;
                try {
                    s = connection.createStatement();
                    s.executeUpdate(query);
                } 
                finally {
                    if (s != null) {
                        s.close();
                    }
                }
            }
    
        });
    }
    
    0 讨论(0)
  • 2020-12-09 19:10

    You must take the underlying delegate using entitymanager.getDelegate() or entitymanager.unwrap(which is the better way), cast it to the specific implementation(in Hibernate it is called Session). Then you can call the connection() method. Be aware this is deprecated, use the Work class instead. Read more here.

    0 讨论(0)
  • 2020-12-09 19:13

    In JPA2.0, if need JDBC is por DTO nomodel or entity for query more complex. Sometimes JPA is not all...

    I hope this will help you:

    Statement statement = null;
    EntityManager em = null;
    em = emf.createEntityManager();
    EntityTransaction et = em.getTransaction();
    
    if(!et.isActive()) {
        et.begin();
    }
    
    java.sql.Connection connection = em.unwrap(java.sql.Connection.class);
    
        String qquerry="SELE ...
        try {   
            statement = connection.createStatement();
            ResultSet rs =  statement.executeQuery(qquerry);                                                              
    
            if (!rs.next()) {
                return null;
            }
            else{
                wwwwas=rs.getString(4);                                 
            }         
            statement.close();
            } 
        catch (SQLException e) {
            System.out.println("\n b-03:"+e);
            throw new RuntimeException(e.getMessage(), e);
        } 
        finally {
            try {
                //  em.getTransaction().commit();
                if(connection != null )
                connection.close();
            } 
            catch (Exception e) {
                throw new RuntimeException(e.getMessage(), e);
           }
        }
    
    0 讨论(0)
  • 2020-12-09 19:14

    This works awesomely and you can use the connection object elsewhere if needed

    SessionImpl sessionImpl = (SessionImpl) session;
    Connection conn = sessionImpl.connection();
    

    Where session is the name of the Hibernate Session object

    0 讨论(0)
  • 2020-12-09 19:18

    The JPA API itself doesn't seem to offer this, not surprisingly, but if you're willing to couple your code to a specific implementation, then you can use something like this (Hibernate):

    Session hibernateSession = entityManager.unwrap(Session.class);
    Connection jdbcConnection = hibernateSession.connection(); 
    

    Note that Session.connection() is deprecated for removal in Hibernate 4. Consider using Session.doWork() instead.

    0 讨论(0)
提交回复
热议问题