Jackson serializa propiedades con nombres dinámicamente diferentes usando mixins

Yo uso diferenteNoSQL bases de datos y dependiendo de la base de datos necesito nombrar el "id" diferente. Entonces por ejemplo enOrientDB la identificación se llama "@rid"

@JsonProperty("@rid")
private String id;

Y para MongoDB el id se llama "_id"

@JsonProperty("@_id")
private String id;

No sé qué está mal con los desarrolladores modernos de bases de datos, no solo nombrando el campo id "id" ^^. Pero ahora tengo un problema. ¿Cómo puedo serializar / deserializar dinámicamente el campo id en algún caso como "@rid" y en otro caso como "_id"?

EDITAR:

Basado en la sugerencia de rmullers, intenté usar mixins. Entonces tengo por ejemplo:

public interface IdMixins {
}

public interface MongoIdMixIn extends IdMixins {
    @JsonProperty("_id") String getId();
    @JsonProperty("_id") void setId(String id);
}

public interface OrientIdMixIn extends IdMixins{
    @JsonProperty("@rid") String getId();
    @JsonProperty("@rid") void setId(String id);
}

Donde IdMixins es una interfaz completamente vacía que se usa para obtener más control sobre qué interfaces se pueden pasar al mapeador.

Entonces hay una clase:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@javaClass")
public abstract class AbstractBean implements Serializable {
    private static final long serialVersionUID = -1286900676713424199L;

    // @JsonProperty("@rid")
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Pero cuando ejecuto esta simple prueba, la salida sigue siendo "id":

public class MixinTest {
    public static void main(String[] args) throws JsonProcessingException {
        Foo f = new Foo();
        f.setId("123");
        f.setBar("lala");

        ObjectMapper mapper = new ObjectMapper();

        ObjectMapper m2 = mapper.copy();
        m2.addMixInAnnotations(AbstractBean.class, MongoIdMixIn.class);
        System.out.println(m2.writeValueAsString(f));

        ObjectMapper m3 = mapper.copy();
        m3.addMixInAnnotations(AbstractBean.class, OrientIdMixIn.class);
        System.out.println(m3.writeValueAsString(f));

    }

    public static class Foo extends AbstractBean {
        private String bar;

        public String getBar() {
            return bar;
        }

        public void setBar(String bar) {
            this.bar = bar;
        }
    }
}

Salidas:

{"@javaClass": "test.MixinTest $ Foo", "id": "123", "bar": "lala", "@ class": "Foo"} {"@javaClass": "test.MixinTest $ Foo "," id ":" 123 "," bar ":" lala "," @ class ":" Foo "}

Respuestas a la pregunta(1)

Su respuesta a la pregunta