Yep this is a pain, only a few implementations support user defined feature ids.

There are two things:
- check the capabilities of the datastore to see if it supports this functionality
- use a "user data" hint to enable the extra functionality

Here is the example from the documentation:

if( featureStore.getQueryCapabilities().isUseExisingFIDSupported() ){
    // featureStore allows us to create our own featureIDs
    SimpleFeatureBuilder b = new SimpleFeatureBuilder(featureStore.getSchema());
    DefaultFeatureCollection collection = new DefaultFeatureCollection(null,featureStore.getSchema());

    String typeName = b.getFeatureType().getTypeName();
    for( FeatureIterator iter=features.features(); iter.hasNext(); ){
        SimpleFeature feature = (SimpleFeature);

        b.init( feature ); // take feature into a builder to modify
        b.featureUserData(Hints.USE_EXISTING_FID, Boolean.TRUE);
        feature = b.buildFeature( typeName+"."+System.currentTimeMillis() );

        collection.add( feature );
else {
   // allow featurestore to create featureIDs
   featureStore.addFeatures( features );
And the link:

Jody Garnett

On Monday, 3 December 2012 at 10:38 PM, Fritz Richter wrote:

Hi together,
I'm playing around now for hours an simply can not make it run.

I try to store a feature into postgis, which is almost working perfectly, except the feature id.

Polygon polygon = GisUtils.convertToPolygon(tile);
builder.set("updated", new Date());
builder.set("geom", polygon);
SimpleFeature feature = builder.buildFeature(featureId);

In my case the featureID is set to "18/12/12". When I look into the database table, the id looks like this "fid--50250c12_13b60c20cc4_-7061".
I really do not know, why my featureId is not used but the stange id appears.

Any help?

My db definition looks like this:
  tile_id text NOT NULL,
  updated timestamp without time zone NOT NULL,
  geom geometry,
  CONSTRAINT pk_result PRIMARY KEY (tile_id ),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'POLYGON'::text OR geom IS NULL),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
  OWNER TO postgres;

Keep yourself connected to Go Parallel:
BUILD Helping you discover the best ways to construct your parallel projects.
GeoTools-GT2-Users mailing list