Inserire metodi custom nel service di Liferay

Visto che per l’ennesima volta stavo perdendo la testa su come e dove creare i metodi custom per l’accesso al db, ho fatto questo piccolo documento che può servire per non perdere tempo ogni volta.

******************************************
Si vuole implementare un metodo custom del tipo “ReturnType newMethodName(InputType arg)” per l’entità Xyz

fase 1) nella classe src/a.b.c.servicebuilder.service.persistence.XyzFinderImpl inserire il nuovo methodo con tutto il codice necessario

public ReturnType newMethodName(InputType arg) throws SystemException {

}

Lanciando ora il “build-service” verranno modificate le classi/interface

1.a) service/a.b.c.servicebuilder.service.persistence.XyzFinder (interface) con la definizione

public ReturnType newMethodName(InputType arg) throws SystemException;

1.b) service/a.b.c.servicebuilder.service.persistence.XyzFinderUtil (class) con il metodo

public static ReturnType newMethodName(InputType arg) throws com.liferay.portal.SystemException {
return getFinder().newMethodName(arg);
}

Pertanto sarà possibile richiamare il metodo come XyzFinderUtil.newMethodName(value);

Se si vuole rendere disponibile il nuovo metodo anche dalla XyzLocalServiceUtil (cosa consigliabile):

fase 2) nella classe src/a.b.c.servicebuilder.service.impl.XyzLocalServiceImpl inserire il codice del metodo

public ReturnType newMethodName(InputType arg) throws SystemException {
return xyzFinder.newMethodName(arg);
}

Lanciando nuovamente il “build-service” verranno modificate le classi

2.a) service/a.b.c.servicebuilder.service.XyzLocalService
2.b) service/a.b.c.servicebuilder.service.XyzLocalServiceClp
2.c) service/a.b.c.servicebuilder.service.XyzLocalServiceUtil

Pertanto sarà possibile richiamare il metodo come XyzLocalServiceUtil.newMethodName(value);

——————————————————-

Per poter lanciare il “build-service” solo una volta (e non due come nel caso precedente) si deve “anticipare” la creazione della definizione nell’interfaccia service/a.b.c.servicebuilder.service.persistence.XyzFinder:

fase 1) nella classe src/a.b.c.servicebuilder.service.persistence.XyzFinderImpl inserire il nuovo methodo

public ReturnType newMethodName(InputType arg) throws SystemException {

}

fase 2) inserire direttamente nell’interface service/a.b.c.servicebuilder.service.persistence.XyzFinder la definizione

public ReturnType newMethodName(InputType arg) throws SystemException;

fase 3) nella classe src/a.b.c.servicebuilder.service.impl.XyzLocalServiceImpl inserire il codice del metodo

public ReturnType newMethodName(InputType arg) throws SystemException {
return xyzFinder.newMethodName(arg);
}

Lanciando ora il “build-service” verranno modificate le classi/interface

3.a) service/a.b.c.servicebuilder.service.persistence.XyzFinderUtil
3.b) service/a.b.c.servicebuilder.service.XyzLocalService
3.c) service/a.b.c.servicebuilder.service.XyzLocalServiceClp
3.d) service/a.b.c.servicebuilder.service.XyzLocalServiceUtil

Pertanto sarà possibile richiamare il metodo come XyzLocalServiceUtil.newMethodName(value);

Liferay e le query di hibernate

Spesso mi sono chiesto quali fossero le query che liferay lanciasse su database (sia per la “normale” attività oppure a seguito di una DynamicQuery. Cercando un po’ in effetti la soluzione è abbastanza semplice: si inserisce nel portal-ext.properties della propria installazione (il file di configurazione custom presente sotto webapps/ROOT/WEB-INF/classes) la riga

hibernate.show_sql = true

Questo settaggio genera nei file di log delle righe tipo:

Hibernate: INSERT INTO table (field1, field2, field3) VALUES (?, ?, ?)

Gli svantaggi ovvi sono un’aumento di dimensione dei log (infatti l’impostazione è consigliabile solo in ambiente di sviluppo e non in produzione) e la mancanza dei valori effettivi dei parametri.

Altri link:

Un articolo sul forum di Liferay: http://www.liferay.com/community/forums/-/message_boards/message/109981

Un utilizzo generico della direttiva per hibernate: http://www.mkyong.com/hibernate/hibernate-display-generated-sql-to-console-show_sql-format_sql-and-use_sql_comments/