Hibernate. mapear 1 - N bidirecional (exemplo)

Tenho a seguinte associação bidirecional: 1 cliente possui 0 ou N Orçamentos.
No mapeamento da classe cliente, tenho essa tag:

<list name="orcamentos" lazy="true" inverse="true" cascade="save-update"> <key> <column name="CLIENTE_ID" not-null="true" /> </key> <index column="POSICAO" /> <one-to-many class="Orcamento" /> </list>
Vi esse exemplo no livro hibernate in action. Esse mapeamento implica que a tabela ORCAMENTO terá como chave primária CLIENTE_ID e POSICAO ?
Minha idéia inicial não sera essa. Caso eu queira deixar assim, como eu deveria fazer o mapemento do orcamento? Veja como fiz abaixo (considerei que orcamento possui ID):

[code]

    <class name="Orcamento" table="ORCAMENTO">
            
            <id name="id">
                    <generator class="sequence">
                    	<param name="sequence">ORCAMENTO_GEN</param>
                    </generator>
            </id>

            <property name="data"
            	not-null="true"/>

            <property name="valorTotal"
            	not-null="false"/>

            <many-to-one name="cliente" 
            	column="CLIENTE_ID"
            	not-null="true" />

    </class>

[/code]

Não, significa que a tabela precisará ter dois campo:
CLIENTE_ID e POSICAO
Quando o hibernate trouxer alista do banco, ele fará algo como:
[pseudo-code]

resultset = select * from Orcamento where CLIENT_ID = this.clientID;
     list = new ArrayList();
    while (resultSet.hasNext()){
         row = resultSet.next();
        orcamento = new Orcamento();
        popula(orcamento, row);
        i = row.POSICAO;
        list.add(i, orcamento)

[/pseudo-code]

Do jeito que você fez tá bom. Mas a tabela Orcamento vai precisar de um campo POSICAO.

A propósito, o que este tópico tá fazendo em padrões, arquitetura e projetos ???

Oi, deixei a pergunta aqui, pois na descrição desse fórum diz para colocar perguntas relacionadas a frameworks, entre outros assuntos.

No manual do hibernate diz que coleções com semântica de lista devem ter uma coluna de índice, do tipo inteiro. Veja: All collection mappings, except those with set and bag semantics, need an index column in the collection table - a column that maps to an array index, or List index, or Map key… The index of an array or list is always of type integer and is mapped using the element.
O livro hibernate in action também diz isso: A mapping requires the addition of an index column to the database table.
Pelo que entendi eu seria obrigado a ter uma coluna POSICAO. Seria isso mesmo?

E quanto a chave primária? Acho que não seria muito legal ela ser composta de 2 campos, pois a classe Orcamento terá itens de orcamento, que terá outras relações. Se for ficar utilizando chaves compostas, terei relações com chaves primárias com vários atributos.

primeira pergunta… os valores se repetem? se nao puderem repetirer use um Set.

se for o caso voce tambem pode usar um mapear um bag que faz a mesma coisa.

faz assim: Fazenda tem varias safras

[code]

          <key
              column="COD_FAZENDA"
          />

          <one-to-many
              class="br.com.sementesfroes.safra.Safra"
          />
    </bag>[/code]

as safras são associadas a uma fazenda

<many-to-one name="fazenda" class="br.com.sementesfroes.fazenda.Fazenda" cascade="none" outer-join="auto" update="true" insert="true" column="COD_FAZENDA" />

Espero que ajude.

Oi,
quero usar , pois minhas coleções no java são List. Você tem algum exemplo disso usando ?

[quote=ronaldorezende]Oi,
quero usar , pois minhas coleções no java são List. Você tem algum exemplo disso usando ?[/quote]

no momento so tenho este exemplo… Espero que alguem mais postar algo sobre isso para que nos possamos apreder. =D

so um perguntinha… como voce esta declarando a lista no java? Se for como no codigo abaixo, você pode usar o bag mesmo.

Abraço,

Flavio Oliva