SmartGwt – Llave primaria compuesta (composite primary key)

septiembre 20, 2012

Si tienes una tabla(entidad) con una llave primaria compuesta por 2 o más columnas -y quieres crear un DataSource para enlazar un control a los datos- tendrías que hacerlo de la siguiente manera.
Supongamos que tenemos una tabla donde registramos una estadística mensual. Tendríamos la siguiente clase

public class MonthStat{
	long categoryId;
	int month;
	int year;
	double data;

	public MonthStat(){
	}
}

La llave primaria estaría conformada por el id de la categoría, el mes y el año del dato estadístico.
En SmartGwt vamos a crear el DataSource de la siguiente manera

DataSource monthStatsDS=new RestDataSource(){
	{
		setDataURL(Consts.REST_MONTHSTATS);
		setDataFormat(DSDataFormat.JSON);

		DataSourceField fldId=new DataSourceField("key", FieldType.TEXT);
		fldId.setPrimaryKey(true);
		fldId.setHidden(true);
		DataSourceField fldCategoryId=new DataSourceField("categoryId", FieldType.INTEGER);
		DataSourceField fldMonth=new DataSourceField("month", FieldType.INTEGER);
		DataSourceField fldYear=new DataSourceField("year", FieldType.INTEGER);
		DataSourceField fldData=new DataSourceField("data", FieldType.FLOAT);
		setFields(fldId,fldCategoryId,fldMonth,fldYear,fldData);
	}

	@Override
	protected void transformResponse(DSResponse response,
			DSRequest request, Object data) {
		Record[] monthStatRecord = response.getData();
		for(int i=0;i<monthStatRecord.length;i++){
			monthStatRecord[i].setAttribute("key",
					monthStatRecord[i].getAttribute("categoryId")+"#"+
					monthStatRecord[i].getAttribute("month")+"#"+
					monthStatRecord[i].getAttribute("year"));
		}
		super.transformResponse(response, request, data);
	}
};

Este DataSource obtiene los datos de un servicio REST. Lo interesante es que creamos un nuevo atributo ‘key’ en cada registro, donde concatenamos los atributos que forman la llave primaria -separados por el símbolo ‘#’- y asignamos ese campo como el primary key del DataSource.
Si utilizamos este DataSource en un SelectItem se complica un poco más la cosa, ya que este control sólo acepta un campo para el valor que va a mostrar y un campo para el valor real. En este caso tendríamos que descomponer la llave en sus elementos del lado del servidor.
Por ejemplo

SelectItem itmMonthStatData=new SelectItem("month","Select month");
itmMonthStatData.setOptionDataSource(monthStatsDS);
itmMonthStatData.setAutoFetchData(true);
itmMonthStatData.setDisplayField("month");
itmMonthStatData.setValueField("key");

nos enviaría al servidor un parámetro “month” -debido al nombre que utilizamos para el SelectItem- con un valor como “25#12#2012” y obtendríamos los elementos de la siguiente forma

@POST
public String create(
		@FormParam("month")String key){
	StringTokenizer token=new StringTokenizer(key,"#");
	Integer idCategoria=Integer.parseInt(token.nextToken());
	Integer month=Integer.parseInt(token.nextToken());
	Integer year=Integer.parseInt(token.nextToken());

	// haz lo que necesites con estos valores
}

Cabe mencionar que el uso de llaves primarias compuestas es un tema de debate. Se recomienda incluso no utilizarlas, sino mejor crear una nueva columna en nuestra tabla cuyo valor sea autogenerado por alguna secuencia o un UUID.

Fuentes:
http://www.smartclient.com/smartgwt/javadoc/com/smartgwt/client/data/DataSource.html#transformResponse(com.smartgwt.client.data.DSResponse, com.smartgwt.client.data.DSRequest, java.lang.Object)
http://www.smartclient.com/smartgwt/javadoc/com/smartgwt/client/data/DataSourceField.html#setPrimaryKey(java.lang.Boolean)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: