Domanda

Ho due oggetti:

public class ParentObject {
 // some basic bean info
}

public class ChildObject extends ParentObject {
 // more bean info
}

Ciascuna di queste tabelle corrisponde a una tabella differnet in un database. Sto usando Hibernate per interrogare il ChildObject, che a sua volta popolano gli oggetti del genitore valori.

Ho definito il mio file di mapping come:

<hibernate-mapping>
<class name="ParentObject"
       table="PARENT_OBJECT">
   <id name="id"
       column="parent"id">
      <generator class="assigned"/>
   </id>
   <property name="beaninfo"/>
   <!-- more properties -->
   <joined-subclass name="ChildObject" table="CHILD_OBJECT">
       <key column="CHILD_ID"/>
       <!--properties again-->
   </joined-subclass>
</class>
</hibernate-mapping>

posso usare Hibernate per interrogare le due tabelle senza problema.

Io uso

session.createQuery("from ChildObject as child ");

Questa è tutta roba di base Hibernate. Tuttavia, la parte che io sto avendo problemi con è che ho bisogno di applicare le serrature alle tutte le tabelle nella query.

Posso impostare il tipo di blocco per l'oggetto figlio utilizzando il query.setLockType ( "figlio", LockMode.?). Tuttavia, non riesco a trovare un modo per mettere un blocco sulla tabella padre.

Sono nuovo di Hibernate, e sto ancora lavorando intorno a pochi posti di blocco mentale. La domanda è: come posso mettere un lucchetto sul tavolo genitore?

Mi chiedevo se ci fosse un modo per aggirare dover fare questo senza disfare la struttura polimorfico che ho installato.

È stato utile?

Soluzione

Perché devi bloccare entrambe le tabelle? Mi sto chiedendo perché a seconda di ciò che si sta cercando di fare ci possono essere soluzioni alternative per ottenere ciò che si desidera.

Il modo in cui le cose sono, Hibernate normalmente blocca solo la tabella principale a meno che non si sta utilizzando un po 'esotica del database / dialetto. Quindi, è probabile che si sta già bloccando il vostro tavolo ParentObject piuttosto che ChildObject.

Aggiorna (sulla base di un commento):

Poiché si utilizza un database di :-) esotici che non supporta la sintassi FOR UPDATE, Hibernate sta bloccando le tabelle "primarie" in cui sono specificate nella query ( "primario" in questo caso essendo tabella mappata per l'entità di cui clausola FROM, non la radice della gerarchia - ad esempio ChildObject, non ParentObject). Dal momento che si desidera bloccare entrambe le tabelle, io suggerirei di provare una delle seguenti opzioni:

  1. Chiamata session.lock() sulle entità dopo averli ottenuti dalle query. Questo dovrebbe bloccare il root non tabella della gerarchia, ma io sono sicuro al 100% che si tratti funzionerà perché tecnicamente si sta cercando di "upgrade" il blocco che è già detenuto in un dato entità.
  2. Prova a imbrogliare nominando esplicitamente tavolo ParentObject nella query e la richiesta di modalità di blocco per esso:

    String hql = "select c from ChildObject c, ParentObject p where c.id = p.id";
    session.createQuery(hql)
     .setLockMode("c", LockMode.READ)
     .setLockMode("p", LockMode.READ).list();
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top