Pregunta

Tengo dos objetos:

public class ParentObject {
 // some basic bean info
}

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

Cada una de estas mesas corresponde a una tabla en una base de datos differnet. Estoy usando Hibernate para consultar el ChildObject, que a su vez pueblan el padre se opone valores.

he definido mi archivo de asignación como así:

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

Me puede utilizar hibernación para consultar las dos tablas sin problema.

Yo uso

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

Esto es todo lo básico de hibernación. Sin embargo, la parte que estoy teniendo problemas con es que necesito para aplicar bloqueos a las todas las tablas de la consulta.

Puede configurar el tipo de bloqueo para el objeto secundario mediante el uso de la query.setLockType ( "niño", LockMode.?). Sin embargo, me parece que no puede encontrar una manera de colocar un candado en la tabla padre.

Soy nuevo en hibernación, y todavía estoy trabajando en torno a algunos obstáculos mentales. La pregunta es: ¿cómo puedo colocar un candado en la tabla padre?

Me preguntaba si había alguna forma de evitar tener que hacer esto sin deshacer la estructura polimórfica que he establecido.

¿Fue útil?

Solución

¿Por qué tienes para bloquear ambas tablas? Lo digo porque dependiendo de lo que estamos tratando de hacer que puede haber soluciones alternativas para lograr lo que desea.

Como están las cosas, Hibernate normalmente sólo bloquea la tabla raíz menos que esté utilizando algunos exóticos base de datos / dialecto. Por lo tanto, es probable que ya estés bloqueo de la tabla en lugar de ParentObject ChildObject.

Actualizar (basado en el comentario):

Desde que está utilizando una base de datos exótica :-) que no soporta la sintaxis FOR UPDATE, Hibernate está bloqueando las tablas "primarias", ya que se especifican en la consulta ( "primaria" siendo en este caso la mesa asignada para la entidad que figura en el cláusula FROM, no la raíz de la jerarquía - por ejemplo ChildObject, no ParentObject). Dado que desea bloquear ambas tablas, sugeriría probar uno de los siguientes:

  1. Llamada session.lock() en entidades después de haber ellos obtiene a partir de la consulta. Esto debe bloquear la root Mesa de la jerarquía, sin embargo no estoy 100% seguro de si se va a trabajar porque técnicamente que está tratando de "mejorar" el candado que ya está detenido en una determinada entidad.
  2. tratan de engañar al nombrar explícitamente mesa ParentObject en su consulta y solicitar el modo de bloqueo para ello:

    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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top