Pergunta

Eu tenho dois objetos:

public class ParentObject {
 // some basic bean info
}

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

Cada uma dessas tabelas corresponde a uma tabela diferente em um banco de dados. Estou usando o Hibernate para consultar o Objeto de Criança, que por sua vez preencherá os valores dos objetos pai.

Eu defini meu arquivo de mapeamento como assim:

<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>

Eu posso usar o Hibernate para consultar as duas tabelas sem problemas.

eu uso

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

Tudo isso é coisas básicas de hibernato. No entanto, a parte com a qual estou tendo problemas é que preciso aplicar bloqueios a todas as tabelas da consulta.

Eu posso definir o tipo de bloqueio para o objeto filho usando o query.setlocktype ("filho", bloqueio.?). No entanto, não consigo encontrar uma maneira de colocar uma fechadura na tabela pai.

Sou novo no Hibernate e ainda estou trabalhando em alguns obstáculos mentais. A questão é: como posso colocar uma trava na tabela pai?

Eu queria saber se havia uma maneira de fazer isso sem desfazer a estrutura polimórfica que eu configurei.

Foi útil?

Solução

Por que você tem que trancar as duas mesas? Estou perguntando porque, dependendo do que você está tentando fazer, pode haver soluções alternativas para alcançar o que você deseja.

Do jeito que as coisas são, hiberna normalmente apenas trava a tabela de raiz A menos que você esteja usando algum banco de dados / dialeto exótico. Então, é provável que você já esteja travando seu ParentObject Tabela em vez de ChildObject.

Atualizar (com base no comentário):

Como você está usando um banco de dados exótico :-) que não suporta FOR UPDATE Sintaxe, o hibernato está travando as tabelas "primárias", conforme elas são especificadas na consulta ("primário" neste caso sendo mapeada para a entidade listada em FROM Cláusula, não a raiz da hierarquia - por exemplo ChildObject, não ParentObject). Como você deseja trancar as duas tabelas, sugiro que você tente um dos seguintes:

  1. Ligar session.lock() Nas entidades depois de obtê -las da consulta. Isso deve bloquear o raiz Tabela da hierarquia, no entanto, não tenho 100% de certeza sobre se funcionará porque tecnicamente você está tentando "atualizar" a fechadura que já está sendo mantida em uma determinada entidade.
  2. Tente trapacear nomeando explicitamente ParentObject Tabela em sua consulta e solicitando o modo de bloqueio para ele:

    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();
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top