Recuperare connection URL da JBoss e configurazione Hibernate

Durante lo sviluppo si hanno diversi ambienti di lavoro: locale per lo sviluppo, ambienti di test, pre-produzione, produzione ecc…

Può essere utile avere a disposizione una pagina dentro l’applicativo che recuperi i dati dell’ambiente di deploy corrente, in particolare la connessione alla base dati (a quale db mi sto collegando? posso inserire/cancellare/modificare dati senza fare danni??).

  1. Recuperare URL jdbc da un Datasource definito dentro JBoss:

I Datasource configurati per JBoss sono contenuti in un file xml che si trova dentro la cartella di deploy, e sono definiti in questo modo

  1. <datasources>
       <datasource jta="true" jndi-name="java:/jdbc/MyDataBaseDS" pool-name="MyPool" enabled="true"   use-ccm="false">
       <connection-url>jdbc:postgresql://nomedbserver:5432/my_db_user</connection-url>
       <driver-class>org.postgresql.Driver</driver-class>
       <driver>postgresql-jdbc4</driver>
    [..altre info]
       </datasource>
     <drivers>
       <driver name="postgresql-jdbc4" module="org.postgresql"/>
     </drivers>
     </datasources>

    Per recuperarli da codice occorre eseguire la lookup del jndi-name:

    Context context = new InitialContext();
    javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/jdbc/MyDataBaseDS");
    String urlDatabase  = ds.getConnection().getMetaData().getURL();
  2. Recuperare URL di connessione per  hibernate da persistence.xml:

In questo caso l’URL di connessione è dichiarato nel file persistence.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://   www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persis   tence/persistence_2_0.xsd">
     <persistence-unit name="MyDataBase" transaction-type="JTA">
       <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
         <properties>
           <property name="hibernate.cache.use_second_level_cache" value="true" />
           <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
           <property name="hibernate.connection.url" 
            value="jdbc:postgresql://nomedbserver:5432/my_db_user" />
 [..altre info...]
         </properties>
     </persistence-unit>
   </persistence>

per recuperarlo, conviene creare un semplice EJB che dichiari il PersistenceContext tramite annotation, da questo si recupera l’informazione

@Stateless
public class ConfigurazioneAmbienteHome {

 @PersistenceContext 
 protected EntityManager entityManager;
 
 public String getHibernateConnectionUrl() {
   String connectionUrl = entityManager.getEntityManagerFactory().getProperties()
   .get("hibernate.connection.url").toString();
   return connectionUrl;
 }

}

See more at:

http://www.html.it/pag/17188/datasource-collegarsi-a-un-database/

http://www.html.it/articoli/jboss-per-principianti-installazione-e-nozioni-di-base-3/

Annunci

Hibernate one-to-one lazy loading FAIL!

Hibernate, per relazioni one-to-one con optional=true ignora il lazy loading!

Perché?

Ho due tabelle con relazione uno-a-uno:

L’entity che rappresenta B diventa:

class B {
private C cee;
public C getCee(){
   return cee;
}
public void setCee(C cee){
   this.cee = cee;
}
}

Hibernate deve determinare il valore di cee nel momento in cui carica B dal database. Ma, se il campo non è dichiarato come obbligatorio, Hibernate non può stabilire se è null o se è valorizzato senza caricarlo!

Quindi, se cee è annotato con optional=false allora viene applicato il lazy loading, altrimenti, se cee è annotato con optional=true il dato viene sempre caricato dal DB e il lazy loading è ignorato!

See more at:
http://www.bigsoft.co.uk/blog/index.php/2008/10/26/lazy-loading-one-to-one-relationships
http://www.insaneprogramming.be/?p=355
http://justonjava.blogspot.it/2010/09/lazy-one-to-one-and-one-to-many.html