Se ho capito bene (confermami .. magari ho capito male io), il tuo dubbio/problema è come "prendere" in modo corretto il prossimo ID utile da usare per un inserimento nella mappa.
Il mio problema è come prendere in modo corretto il prossimo ID utile nel caso in cui ci sia stata la cancellazione dell'ultima entry disponibile (o la prima, nel caso la mappa fosse stata vuota).
Esempio banale: l'ultima asta inserita ha id 5 e diverse offerte che si riferiscono a quell'asta. Con il mio sistema se cancello l'asta con id5 e poi ne creo una nuova a quest'ultima viene assegnato l'id 5, di conseguenza tutte le offerte che prima riferivano l'asta con id5 verrebbero associate a questa nuova asta e ciò sarebbe ovviamente sbagliato. Questo problema l'ho aggirato cancellando anche le offerte riferite all'asta che sto cancellando, il che mi va anche bene dato che questa è la cosa più logica da fare visto che non ha senso mantenere offerte nel db che non riferiscono più nessuna asta esistente.
Ma il problema mi si può ripresentare anche in altre situazioni visto che deve poter essere possibile cancellare qualsiasi tipo di dato che può avere altri dati che lo referenziano, quindi mi chiedevo se c'è un meccanismo in grado di impedire che un id già precedentemente assegnato (ovviamente per un oggetto di quella mappa) venga riassegnato nuovamente. Siccome gli id li passo io a MapDB lui se ne frega e prende quelli che gli passo (ovviamente) perché a lui basta che non vi siano duplicati nella stessa mappa,quindi nella mia mappa ovviamente non avrò mai due aste
La versione di MapDB che sto usando è piuttosto vecchia, la 0.9.7.

Cosa fa esattamente questa istruzione?
Atomic.Integer offerteId = db.getAtomicInteger("offerte_id");
E dove dovrei metterla?

offerte_id sarebbe il nome della mia chiave?

Considera che io creo/accedo il db in ogni metodo in cui ho bisogno di farlo con queste istruzioni:

codice:
        DB db = DBMaker.newFileDB(new File(FILE_NAME)).closeOnJvmShutdown().make();
        ConcurrentNavigableMap<Integer, Offerta> offerte = db.getTreeMap("offerte");
....
        db.commit();
        db.close();
Peraltro non ho nemmeno capito se il commit() e il close() devono stare solo alla fine del metodo che accede/modifica i dati nel db. Mi è sembrato di capire che il commit è più o meno l'equivalente di una transazione, cioè o fa tutte le modifiche inserite nel metodo o non ne fa nessuna...almeno credo.

e questa:
offerte.put(offerteId.incrementAndGet(), ......... );
immagino serva per l'inserimento e al punto dei puntini ci vada il nome dell'oggetto da inserire...
Grazie!!