domenica 23 settembre 2012

Jpa mappare Primary Key

La primary key è l'identità di un entity bean.
L'annotazione  @javax.persistence.Id identifica la proprietà che funge da primarìy key.
La chiave primaria può essere autogenerata dal provider, in questo caso si utilizza l'annotazione
@javax.persistence.GeneratedValue con le seguenti strategie (attributo strategy):
  • TABLE;
  • SEQUENCE;
  • IDENTITY;
  • AUTO.
AUTO

E'  la strategia di default  che utilizza le colonne autoincrementali presenti in molti database come MySql o Sql Server.

IDENTITY

Con questa strategia si obbliga il provider ad utilizzare i campi autoincrementali del db (esempio in mysql AUTO_INCREMENT e in Sql Server IDENTITY ) Per adottare questa strategia basta fare così:
....
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public long getId(){
.....
}

TABLE

Con questa strategia si definisce una tabella utilizzata come "serbatoio" per fornire le chiavi primarie.
La struttura di questa tabella è la seguente:

create table GENERATOR_TABLE
{
     PRIMARY_KEY_COLUMN VARCHAR not null,
     VALUE_COLUMN long not null
}

Bisogna utilizzare una altra annotazione @TableGenerator dove si specifica il generatore con il nome della tabella creata etc etc.

Esempio

@TableGenerator(name="myGenerator",table="GENERATOR_TABLE",pkColumnName="PRIMARY_KEY_COLUMN",
valueColumnName="VALUE_COLUMN",pkColumnValue="CUST_ID",allocationsize=10)
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="myGenerator")
public long getId(){...}

SEQUENCE

Alcuni RDBMS come Oracle hanno un meccanismo built in per la generazione delle primary key, definito appunto SEQUENCE.
In questi casi a livello di classe va definito il sequence generator utilizzato e referenziato dall'attributo generator dell'annotazione @GeneratedValue.
Esempio:

@Entity
@Table(name="CUSTOMER_TABLE")
@SequenceGenerator(name="CUSTOMER_SEQUENCE",sequenceName="CUST_SEQ")
public class Customer implements Serializable{

.....
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="CUSTOMER_SEQUENCE")
public long getId(){...}
....
}

lunedì 10 settembre 2012

Jsf implementazione Mojarra problemi DOCTYPE

Ho riscontrato un problema utilizzando il motore di JSF 2.0 di Mojarra (versione 2.1.12).
Nel passaggio da una pagina all'altra ho notato che si perdeva il font del carattere.
Il font è impostato da un css personalizzato, siccome come librerie stiamo utilizzando PrimeFaces 3.1 secondo le specifiche della libreria abbiamo messo nello stylesheet:

.ui-widget,        
.ui-widget .ui-widget {
        font-size: 10px;      
               }


In questo modo si ridefinisce il font per tutti i form. Il codice del css è inline nella pagina, in modo da essere sicuri che vada in overrride rispetto a quello di default della libreria di PrimeFaces.
Il motivo della perdita del font è dovuto alla mancata valorizzazione del DOCTYPE nella pagina html generata, nonostante questo sia presente correttamente nell' xhtml della pagina.
Sembra essere proprio un bug di queste ultime versioni(http://java.net/jira/browse/JAVASERVERFACES-2453?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel) anche se nella descrizione riportata si fa riferimento a questo problema solo se sono presenti degli <ui:include sulla pagina e nel nostro caso gli ui:include ci sono sempre, sia nella pagina che si vede correttamente sia nell'altra.
Per risolvere il problema ho preso l'ultima installazione di MyFaces come implementazion; stesso risultato ho avuto prendendo la versione 2.1.1 di Mojarra.


venerdì 7 settembre 2012

JSF stampare i valori in request

Snippet per stampare a video tutti i valori presenti nella request in JSF

Map<String, String> parameterMap = (Map<String, String>) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
Set<String> ss=  parameterMap.keySet();
 for(String s:ss){

           log.debug("Chiave: "+s+" Valore: "+parameterMap.get(s));
       }

mercoledì 5 settembre 2012

Prime Faces lista esportabile

Con Prime Faces , ottima libreria di componenti per jsf 2, sono incappato in un problema per gestire l'export in excel.
Questo perchè la libreria si appoggia alle Apache POI.

Utilizzando primefaces 3.3.1 ho dovuto aggiungere nella lib i jar di Apache POI 3.7 (con qualsiasi altra versione andava in errore).
La lista totale dei jar nella WEB-INF/lib è la seguente
  •  primefaces-3.3.1.jar
  •  itext-1.4.8.jar
  •  log4j-1.2.13.jar
  •  commons-logging-1.1.jar
  • junit-3.8.1.jar
  •  javax.faces-2.1.12.jar
  • poi-scratchpad-3.7-20101029.jar
  •  poi-examples-3.7-20101029.jar
  •  poi-ooxml-3.7-20101029.jar
  •  poi-3.7-20101029.jar
  •  poi-ooxml-schemas-3.7-20101029.jar
Il testo della porzione di .xhtml è reperibile qui sul sito di Prime Faces.

Ho notato che dentro le p:column se invece di fare come scritto sul sito ossia così:

  <p:column> 
        <f:facet name="header"> 
            <h:outputText value="Model" /> 
        </f:facet> 
        <h:outputText value="#{car.model}" /> 
    </p:column>
 


Si fa

  <p:column> 
       #{car.model}
    </p:column>  


Il dato non è stampato correttamente sull'excel/pdf.
Allo stesso modo se non si inserisce la facet con l'header non si visualizzano le intestazioni di colonna.




sabato 1 settembre 2012

Collisione di Persistence Context

Interessante questo post trovato su Javaranch (http://www.coderanch.com/t/431474/java-EJB-SCBCD/certification/PersistenceContext-Collision ) .

Se uno stateless session bean chiama un metodo di un ejb a cui è associato un Persistence Context EXTENDED ( ossia gli oggetti restano sincronizzati anche dopo la chiamata ai singoli metodi), poichè c'è collisione tra i persistence context si verifica un errore.

Si ricordi che il Persistence Context EXTENDED non può mai essere associato agli Ejb Stateless.