2011-11-13 10 views
11

estoy pasando por lock method de hibernación. No obtuve lo que estamos tratando de lograr a través de este método.cuál es el propósito del método Session.lock en Hibernate

p1 = (Person)session. get(Person.class,1);// person name is scott here 
// here peson name got update to henry by anothet thread 
session. lock(person, LockMode.READ) line 3 
// still name is henry too 

me trataron anteriormente fragmento de código pero no leyó la persona de la base de datos en la línea 3. Documentación dice que esto puede ser utilizado para realizar una comprobación de versión.

No

seguro de cómo se compruebe la versión y ayuda al desarrollador en cualquier escenario?

Del mismo modo no está seguro de lo que va a lograr session.lock(person, LockMode.None). La documentación dice LockMode.NONE se utiliza para simplemente volver a asociar una instancia transitoria con una sesión.

No está seguro de lo que quiere decir con reasociación una instancia transitoria con la sesión. Un breve escenario será de gran ayuda?

Respuesta

11

Los diferentes modos de bloqueo están diseñados para evitar que la entidad se modifique y lea de múltiples fuentes simultáneamente; consulte la entrada de la documentación sobre pessimistic locking para obtener más información. En mi experiencia, estos son rara vez es necesaria, ya que el nivel de aislamiento de la base de datos por lo general se encarga de bloqueo, según sea necesario:

No se pretende que los usuarios pasan mucho tiempo preocupándose acerca del bloqueo estrategias. Por lo general, es suficiente especificar un nivel de aislamiento para las conexiones JDBC y luego simplemente dejar que la base de datos haga todo el trabajo. Sin embargo, los usuarios avanzados pueden desear obtener bloqueos pesimistas exclusivos o volver a obtener bloqueos al comienzo de una nueva transacción.

En cuanto a la "reasociación una instancia transitoria con la sesión" (De hecho, creo que quieren decir instancia separada?), Considere la siguiente imagen (Hibernate entity lifecycle):

Hibernate entity lifecycle

Esta es la descripción de Hibernate community documentation:

define Hibernate y soporta los siguientes estados de objeto:

  • transitoria - un objeto es transitorio si sólo se ha creado una instancia usando el nuevo operador, y no está asociada con una Hibernate Sesión. No tiene representación persistente en la base de datos y no se ha asignado ningún valor de identificador . Las instancias transitorias serán destruidas por el recolector de basura si la aplicación ya no tiene una referencia . Usar la sesión de Hibernate para hacer un objeto persistente (y dejar que Hibernate se encarga de las sentencias SQL que necesita ser ejecutado para esta transición).
  • persistente - una persistente ejemplo tiene una representación en la base de datos y un valor de identificador. Puede haber sido guardado o cargado, sin embargo, es por definición en el ámbito de una sesión. Hibernate detectará cualquier cambio realizado en un objeto en estado persistente y sincronizará el estado con la base de datos cuando la unidad de trabajo finalice.Los desarrolladores no ejecutan las instrucciones manual UPDATE o DELETE cuando un objeto debe ser transitorio.
  • Independiente: una instancia separada es un objeto que ha sido persistente, pero su sesión se ha cerrado. La referencia a el objeto sigue siendo válido, por supuesto, y la instancia separada podría incluso modificarse en este estado. Una instancia separada se puede volver a conectar a una nueva sesión en un momento posterior, lo que hace (y todas las modificaciones ) persistentes de nuevo. Esta característica habilita un modelo de programación para unidades de trabajo de larga ejecución que requieren tiempo de reflexión del usuario. Nosotros los llamamos transacciones de aplicaciones, es decir, una unidad de trabajo desde el punto de vista del usuario.
Cuestiones relacionadas