Loading ...
Sorry, an error occurred while loading the content.
 

Hibernate? Proxy, Lazy Initialization ou o que ?

Expand Messages
  • Aloisio Spadeto
    Ola javaneses, Tenho uma dúvida com o Hibernate: Considerando a existência de mapeamentos para duas entidades que, fisicamente se relacionam, em ONE-TO-MANY.
    Message 1 of 2 , Aug 30, 2004
      Ola javaneses,


      Tenho uma dúvida com o Hibernate:

      Considerando a existência de mapeamentos para duas entidades que,
      fisicamente se relacionam, em ONE-TO-MANY.

      Entidades:

      SISTEMA
      ----------------------------------
      cdsistema integer (PK)
      desistema varchar(30)
      ==================================

      MODULO
      ----------------------------------
      cdmodulo integer (PK)
      cdsistema integer (FK)
      demodulo varchar(50)
      ==================================


      No mapemamento da entidade MODULO expresso a relação com o SISTEMA
      por <MANY-TO-ONE>, como abaixo:

      <many-to-one class="Sistema" name="sistema" not-null="true">
      <column name="CDSISTEMA" />
      </many-to-one>

      Quando executo qualquer consulta em MODULOs o Hibernate traz
      automaticamente o SISTEMA relacionado, exemplo:

      session.find("from Modulo as m where m.demodulo=?", desc,
      Hibernate.STRING);

      Resultado lançado no console:

      SELECT modulo.... FROM modulo as m WHERE (m.demodulo LIKE ?)
      SELECT sistema ... FROM sistema as s WHERE (s.cdsistema = ?)

      Ai vai a pergunta:

      Existe uma maneira de mapear o relacionamento para que as
      consultas de MODULOs não retornem automaticamente os SISTEMAs? Seja
      por meio de algum tipo de Proxy ou alguma técnica de Lazy do Hibernate?
      Ou seja, o comportamento que eu espero é:

      Quando executar essa consulta:
      session.find("from Modulo as m where m.demodulo=?", desc,
      Hibernate.STRING);

      Resultado:
      SELECT modulo.... FROM modulo as m WHERE (m.demodulo LIKE ?)

      E somente seria executado o SELECT em SISTEMA caso fosse chamado
      um método da classe Módulo:

      modulo.getSistema()
      SELECT sistema ... FROM sistema as s WHERE (s.cdsistema = ?)
    • Antonio Carlos da Graça Mota Durão de
      Olá, Dá uma olhada na página 13 do manual em PDF e vê se é isso que vc quer:
      Message 2 of 2 , Sep 1, 2004
        Olá,

        Dá uma olhada na página 13 do manual em PDF e vê se é isso que vc quer:
        ****************************************************************************************
        In a Session, every database operation occurs inside a transaction that
        isolates the database operations (even
        read-only operations). We use Hibernates Transaction API to abstract
        from the underlying transaction strategy
        (in our case, JDBC transactions). This allows our code to be deployed
        with container-managed transactions
        (using JTA) without any changes. Please note that the example above does
        not handle any exceptions.
        Also note that you may call HibernateUtil.currentSession(); as many
        times as you like, you will always
        get the current Session of this thread. You have to make sure the
        Session is closed after your unit-of-work
        completes, either in your servlet code or in a servlet filter before the
        HTTP response is send. The nice side effect
        of the latter is easy lazy initialization: the Session is still open
        when the view is rendered, so Hibernate can
        load unitialized objects while you navigate the graph
        ****************************************************************************************

        []s
        AC
      Your message has been successfully submitted and would be delivered to recipients shortly.