2012-05-15 24 views

Respuesta

4

Como solución alternativa, se puede recuperar los EntityManagerFactory propiedades para obtener la configuración de la base de datos subyacente , que es específico de la implementación.

  • Hibernate: hibernate.connection.driver_class

  • EclipseLink:eclipselink.target-database Esta propiedad especifica la base de datos de destino. En su caso, puede tener un valor como Oracle o PostgreSQL para la base de datos respectiva.

  • general:javax.persistence.jdbc.driver

partir de esta información, se puede obtener la base de datos conectada actualmente.

EntityManagerFactory emf = entityManager.getEntityManagerFactory();  
Map<String, Object> emfProperties = emf.getProperties(); 

String driverClass = (String)emfProperties.get(PROPERTY); 
//-- For PostgreSQL, it will have value "org.postgresql.Driver" 

if(driverClass.lastIndexOf("postgresql") != -1) 
    postGreSQL_DB = true; 

Nota:No mucho claro en su diseño de la aplicación, pero puede suceder que su aplicación se conecta a las bases de datos. Si es posible, puede intentar tener EntityManager por separado para cada base de datos, apuntar a diferentes unidades de persistencia en persistence.xml & puede usarlo en consecuencia.

Si este no es el caso & sólo uno de ellos está conectado a la vez, entonces puede simplemente verificar que por entityManager.isOpen() o emf.isOpen().

Editar:

Connection connection = entityManager.unwrap(Connection.class); 
DatabaseMetaData metaData = connection.getMetaData(); 

ahora de esto, se puede obtener el nombre del producto de base de datos, etc. conductor

+0

Gracias Nayan por estos útiles consejos. Cuando trato de obtener fem de em, no los veo, así que se me ocurrió este código DatabaseMetaData dbmd = ((Session) entityManager.getDelegate()). Connection(). GetMetaData(); dbName = dbmd.getDatabaseProductName(); – user509755

+0

No sé si este código es portátil para el servidor de diferencias y la forma correcta de hacerlo, ya que hibernate va a eliminar el método connection() de la versión 4.x. Pero por ahora esto funcionará para mí. – user509755

+0

@ user509755 Me alegro de que lo haya encontrado útil. Lo intenté con el administrador de la entidad como lo mencionaste en cuestión. Además, qué sucedió cuando probaste con el administrador de la entidad. Puede publicarlo como respuesta, podría ayudar a alguien. –

0

si alguien más (como yo) quiere tratar de obtener alguna información y JDBC está utilizando 4.x de hibernación, es posible tratar de esa manera:

import java.sql.Connection; 
import java.sql.SQLException; 
import org.hibernate.jdbc.Work; 
public class ConnectionInfo implements Work { 

public String dataBaseUrl; 
public String dataBaseProductName; 
public String driverName; 

@Override 
public void execute(Connection connection) throws SQLException { 
    dataBaseUrl = connection.getMetaData().getURL(); 
    dataBaseProductName = connection.getMetaData().getDatabaseProductName(); 
    driverName = connection.getMetaData().getDriverName(); 
} 

public String getDataBaseProductName() { 
    return dataBaseProductName; 
} 

public void setDataBaseProductName(String dataBaseProductName) { 
    this.dataBaseProductName = dataBaseProductName; 
} 

public String getDataBaseUrl() { 
    return dataBaseUrl; 
} 

public void setDataBaseUrl(String dataBaseUrl) { 
    this.dataBaseUrl = dataBaseUrl; 
} 

public String getDriverName() { 
    return driverName; 
} 

public void setDriverName(String driverName) { 
    this.driverName = driverName; 
} 
} 

Ahora se puede recuperar la información de esa manera:

// -- snip 
org.hibernate.ejb.EntityManagerImpl entityManagerImpl = (org.hibernate.ejb.EntityManagerImpl) genericDBAccess.getEntityManager().getDelegate(); 
    Session session = entityManagerImpl.getSession(); 
    connectionInfo = new ConnectionInfo(); 
    session.doWork(connectionInfo); 
// -- snap 

Espero que ayude! Me volví loco al encontrar esta información ...

4

En Hibernate 4, puede obtener las informaciones de bases de datos desde el gestor de entidades con ese código:

org.hibernate.engine.spi.SessionImplementor sessionImp = 
    (org.hibernate.engine.spi.SessionImplementor) eManager.getDelegate(); 
DatabaseMetaData metadata = sessionImp.connection().getMetaData(); 
//do whatever you need with the metadata object... 
metadata.getDatabaseProductName(); 

Saludos

Emmanuel

+0

En las versiones más nuevas pf Hibernate 3 también funciona. – SkorpEN

+0

¿Cómo obtengo el administrador de entidades ('eManager')? – sakra

1

Sobre la base de Emmanuel responder cómo hacerlo con la primavera y Hibernar:

@Repository 
public class UserRepository { 

    @PersistenceContext 
    private EntityManager em; 

    public void getMeta() { 
     org.hibernate.engine.spi.SessionImplementor sessionImp = (org.hibernate.engine.spi.SessionImplementor) em.getDelegate(); 
     DatabaseMetaData metadata = null; 
     try { 
      metadata = sessionImp.connection().getMetaData(); 
      ResultSet res = metadata.getColumns(null, null, "USERS", "USERNAME"); 
      System.out.println("List of columns: "); 
      while (res.next()) { 
       System.out.println(
         " " + res.getString("TABLE_SCHEM") 
           + ", " + res.getString("TABLE_NAME") 
           + ", " + res.getString("COLUMN_NAME") 
           + ", " + res.getString("TYPE_NAME") 
           + ", " + res.getInt("COLUMN_SIZE") 
           + ", " + res.getInt("NULLABLE")); 
      } 
      res.close(); 
      System.out.println(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Cuestiones relacionadas