La forma más portátil es usar TableGenerator . Es portátil porque no se utilizan construcciones específicas del proveedor de la base de datos. El último valor generado se almacena en la tabla de la base de datos y el valor se recupera e incrementa a través de consultas SQL.
El uso también está cubierto en Hibernate documentación.