Nibernate mapeamento individual, onde os dados da segunda tabela podem ser nulos

StackOverflow https://stackoverflow.com/questions/244812

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho um banco de dados existente com as transações da tabela. Eu adicionei uma nova tabela chamada TransactionSequence, onde cada transação terá apenas um registro. Estamos usando a tabela de sequência para contar transações para uma determinada conta. Eu mapeei isso como um mapeamento individual, onde a TransactionSequence tem uma chave primária do transactionID.

A restrição é que existe um gatilho em vez da tabela de transações não permite atualizações de transações canceladas ou publicadas.

Então, quando a sequência é calculada e a transação é salva, o Nhibernate tenta enviar uma atualização sobre a transação como 'Atualizar o conjunto de transações transactionID =? Onde transactionID =? '. Mas isso falha por causa do gatilho. Como posso configurar meu mapeamento para que o Nhibernate não tente atualizar a tabela de transações quando uma nova tabela de sequência de transações for inserida?

Mapeamento de transações:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
    <id name="Id" column="ID">
        <generator class="native" />
    </id>

    <property name="TransactionTypeId" access="field.camelcase-underscore" />
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join"
                 lazy="false" constrained="false">      
    </one-to-one>
</class>

E o mapeamento de sequência:

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
    <id name="TransactionId" column="TransactionID" type="Int32">
        <generator class="foreign">
            <param name="property">Transaction</param>
        </generator>
    </id>

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />

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

    <one-to-one name="Transaction" 
                class="Transaction" 
                constrained="true" 
                foreign-key="fk_Transaction_Sequence" />

</class>

Qualquer ajuda seria muito apreciada...

Foi útil?

Solução

Um a um mapeamento no Nibernate não funciona da maneira que você acha que funciona. Ele foi projetado para que você tenha duas classes, que quando persistidas em suas tabelas correspondentes têm as mesmas teclas primárias.

No entanto, você pode fazê -lo funcionar, mas não é bonito. Vou mostrar como oferecer algumas alternativas:

Na sua transação HBML:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>

Em sua sequência html:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />

este deve Faça o que você quer fazer. Observe a propriedade-ref.

A próxima pergunta sobre a qual você postará será perguntar como você recebe o carregamento preguiçoso em associações individuais. A resposta é que você não pode ... bem, você pode, mas provavelmente não funcionará. O problema é que você tem sua chave estrangeira na tabela de sequência, o que significa que o Nhibernate precisa atingir o banco de dados para verificar se o destino existe. Então você pode tentar brincar com o restrito = "True/False" para ver se você pode convencê-lo a carregar preguiçosamente a associação individual.

Em suma, isso resultará em um desperdício total do seu tempo.

Eu sugiro:

  1. Tem duas associações muitas para um.
  2. Tenha uma associação muitos para um com uma coleção do outro lado.

Isso economizará muitas dores de cabeça a longo prazo.

Outras dicas

Acontece que para minha situação um <join table> O mapeamento funcionou melhor. Eu só tinha que ter certeza de que fiz as propriedades que vieram da segunda tabela eram tipos anuláveis, ou faria uma inserção ao salvar, mesmo que nada tivesse mudado. Como eu não precisava de carregamento preguiçoso para a segunda tabela, isso funciona muito bem. Tenho certeza de que eu poderia ter sido emparelhado com muitos mapeamentos para funcionar, mas não era intuitivo e parece mais complicado do que a opção de tabela de junção, no entanto, <join table> está disponível apenas no Nibernate 2.0 ou mais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top