Forums

Home » Liferay Portal » Español » 3. Desarrollo

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Fernando Rubio Sancho
Service Builder Secuencias
October 15, 2012 3:55 AM
Answer

Fernando Rubio Sancho

Rank: New Member

Posts: 10

Join Date: September 16, 2012

Recent Posts

Hola,

Estoy trabajando con Liferay CE 6.0.6 y el plugin SDK 6.0.6, para el acceso a datos he probado inicialmente mediante Hibernate y DAO y funciona correctamente, pero al intentar hacerlo funcionar con Service Builder me funciona todo excepto el tema de la secuencia que parece no funcionar, dándome un error de BeanLocator Not Set. He estado búscando por los foros de Liferay y aquí http://issues.liferay.com/browse/LPS-26031 parece indicar que este tema se resuelve en la versión 6.10. El problema es que tengo que trabajar por cuestiones de requisitos con la versión 6.0.6.

Con hibernate me funciona correctamente con el siguiente fichero de hibernate:

hibernate-mapping>
<class name="model.catalogos.CMunicipio" table="c_municipio" schema="carreteras_gu">
<id name="idMun" type="int">
<column name="id_mun" />
<generator class="sequence" >
<param name="sequence">carreteras_gu.c_municipio_seq</param>
</generator>
</id>
</class>
</hibernate-mapping>

Pero con Service Builder teniendo el fichero service.xml de la siguiente manera:

<service-builder package-path="carreterasportlet">
<author>frubio</author>
<namespace>carreterasportlet</namespace>
<entity name="c_municipio" table="c_municipio" local-service="true" remote-service="false"
data-source="carreterasDataSource" session-factory="carreterasSessionFactory" tx-manager="carreterasTransactionManager">
<column name="id_mun" type="int" primary="true" id-type="sequence" id-param="carreteras_gu.c_municipio_seq" />
<column name="nombre" type="String"/>
</entity>
</service-builder>

Genera el siguiente portlet-hbm.xml:

<hibernate-mapping default-lazy="false" auto-import="false">
<import class="model.c_municipio" />
<class name="model.impl.c_municipioImpl" table="c_municipio" schema="carreteras_gu">
<cache usage="read-write" />
<generator class="sequence" >
<param name="sequence">carreteras_gu.c_municipio_seq</param>
</generator>
</id>
</class>
</hibernate-mapping>

El parámetro schema="carreteras_gu" lo pongo manualmente para que funcione correctamente. El tema es que siguiendo las instrucciones que vienen en el DTD de la versión Liferay 6.0.6 aquí-> http://docs.liferay.com/portal/6.0/definitions/liferay-service-builder_6_0_0.dtd.org.html No funciona.
Fernando Rubio Sancho
RE: Service Builder Secuencias
October 15, 2012 3:49 AM
Answer

Fernando Rubio Sancho

Rank: New Member

Posts: 10

Join Date: September 16, 2012

Recent Posts

Para solucionarlo lo que he hecho es no utilizar secuencia y dejarlo como assigned en el service.xml:

<id name="idMun" type="int">
<column name="id_mun" />
<generator class="assigned" />
</id>

y posteriormente utilizar lo siguiente:

c_municipio municipio = new c_municipioPersistenceImpl().create((int)CounterLocalServiceUtil.increment(c_municipio.class.getName()));
municipio.setNombre(nombre);
municipio.setSys_user_alta(login);
c_municipioLocalServiceUtil.addc_municipio(municipio);

Y así, sí que funciona, pero claro no está utilizando la secuencia que es lo que yo quisiera.
Fernando Rubio Sancho
RE: Service Builder Secuencias
October 15, 2012 3:51 AM
Answer

Fernando Rubio Sancho

Rank: New Member

Posts: 10

Join Date: September 16, 2012

Recent Posts

La cuestión es, si voy a tener problemas con el ServiceBuilder en esta versión... ¿No me convendría más utilizar Hibernate por mi cuenta y olvidarme del ServiceBuilder al menos para esta versión?
Fernando Rubio Sancho
RE: Service Builder Secuencias
October 16, 2012 11:41 PM
Answer

Fernando Rubio Sancho

Rank: New Member

Posts: 10

Join Date: September 16, 2012

Recent Posts

Al final lo que he hecho es utilizar en la base de datos un disparador para que actualice el id del municipio mediante la secuencia, en este caso en PostgreSQL:

begin
IF (TG_OP = 'INSERT' ) THEN
NEW.sys_fecha_alta=current_timestamp;
NEW.id_mun=nextval('carreteras_gu.c_municipio_seq'::regclass);
END IF;
return NEW;
end;

Con esto da igual el id que le asigne Liferay.