Hibernate - Generator para select max(id) + 1

Sou usuário do hibernate há 2 anos.
Estou trabalhando com uma base de dados legada, no postgresql, onde a tabela “documento” não possui uma sequência para atribuir o próximo valor de sua chave primária(cd_documento). A estratégia utilizada é consultar o máximo valor de “cd_documento” e adicionar mais um ( select max(id) + 1).
Nunca precisei anteriormente dessa feature e fiquei pasmo quando não a encontrei no hibernate. Espero que não tenha achado-a e que o hibernate fornece um generator que se adeque a minha necessidade. Se ele não possuir, gostaria de saber como é possível extender o hibernate para criar um generator que realize esta tarefa. Vou precisar muito disso, trabalharei com várias tabelas legadas que usam a mesma estratégia!

Agradeço desde já!

Boa tarde amigo!
Se eu consegui entender bem, você quer uma rotina para gerar o número máximo de um campo ID, se for isso, você poderá adotar uma das duas abordagem abaixo:

1º) Se você estiver utilizando algum DAO genérico, poderá criar algo parecido com isso:

public class Dao<T> {

    private Session            session;
    private Class<? extends T> clazz;

    public Dao(Session session, Class<? extends T> clazz) {
        this.session = session;
        this.clazz = clazz;
    }
...
...
...
    public Integer maxID(String fieldID) {
        return ((Long) this.session.createQuery(" select max(:fieldID)+1 from "+ this.clazz.getName() +" as clazz ").setParameter(":fieldID", fieldID).uniqueResult()).intValue();
    }

Ou seja, você chamará o DAO da classe que deseja obter o maxID e passa pelo parâmetro o nome do atributo, isto se os nomes dos atributos forem distintos, caso contrário você poderá utilizar desta forma:

    public Integer maxID() {
        return ((Long) this.session.createQuery(" select max(id)+1 from "+ this.clazz.getName() +" as clazz ").uniqueResult()).intValue();
    }

2º) Você poderá criar no DAO de cada classe, o seguinte código:

    public Integer maxID(String fieldID, String className) {
        return ((Long) getSession().createQuery(" select max(:fieldID)+1 from :className as clazz ").setParameter(":fieldID", fieldID).setParameter(":className ", className ).uniqueResult()).intValue();
    }

Ou seja, para cada DAO das classes, você terá a implementação maxID(…,…) passando pelo 1º parâmetro o nome do atributo ID e no 2º parâmetro o nome da classe.
Eu NÃO UTILIZO esta abordagem e não indico utilizá-la, foi apenas uma demonstração de possibilidades.

Espero ter ajudado de alguma forma.

Boa sorte.

Olá caro softwork.

Primeiramente agradeço pela colaboração.

Pelo conteúdo de sua resposta suponho que o hibernate não possua suporte para o que estou precisando. Para ele não fornecer tal suporte, significa, pelo visto, que utilizar esta estratégia para gerar a chave primária de uma tabela é algo muito errado. Nunca usei isso, sempre deixei isso para o banco fazer, no entanto, como já mencionei, a base de dados é legada.

Pensei algumas formas para resolver o problema. Pensei em adicionar um sequência no postgres para isso, mas o problema é que tem outro sistema que usa a mesma base(estamos reescrevendo este sistema) que seria prejudicado. Logo, não posso realizar isso. Segunda, a que acho mais adequada até o momento, seria extender o hibernate e criar o generator para isto. Ainda não sei o quanto é viável fazer isso.

Estou usando também spring e jsf na aplicação. Não utilizo diretamente a api do hibernate, utilizo a api do spring para trabalhar com o hibernate(classe HibernateTemplate).
Não tenho um Dao genérico, tenho um repositório genérico, para não entrar na discussão sobre as diferenças entre os dois digo, simplesmente, que para este caso não existe muita distinção.
Então poderia fazer isso sim.

public interface BasicRepository<T extends Serializable> {

    public T get(Serializable id);

    public Collection<T> getAll();

    public void add(T entity);

    public void addAll(Collection<T> entities);

    public void remove(T entity);

    public void removeAll(Collection<T> entities);
}

Na implementação de add, posso executar a lógica para obter o id, mas para isso, eu criaria uma outra interface. E teria o problema de que algumas entidades teriam seu id gerado automaticamente outras não, como o repositório é genérico, teria que colocar este método em uma implementação do repositório para a entidade(“Documento”) da tabela do banco(“documento”). Para falar a verdade, no repositório não deve existir a idéia de id de uma tabela do banco de dados. Isso é abstraído. Enfim… não ficaria muito interessante a nível conceitual e para a arquitetura.

Vou tentar extender o hibernate, posto o resultado aqui quando terminar.