A maneira mais portátil é usar TableGenerator . É portátil porque nenhuma construção específica do provedor de banco de dados é usada. O último valor gerado é armazenado na tabela do banco de dados e o valor é recuperado e incrementado por meio de consultas SQL.
O uso também é abordado no Hibernate documentação.