2012-01-23 11 views
5

He revisado algunos de los enlaces de estrategias de búsqueda de hibernación en la red. Un enlace breve y conciso que me ha gustado es http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/. Tenemos cuatro tipos de estrategias de búsqueda. estos son: -Algunas consultas sobre estrategias de búsqueda en hibernación y relación de fetchtype con fetchmode?

  1. fetch- "join" = Desactiva la carga diferida, siempre carga todas las colecciones y entidades.
  2. fetch- "select" (predeterminado) = Lazy carga todas las colecciones y entidades.
  3. batch-size = "N" = Obteniendo colecciones o entidades 'N', No graba.
  4. fetch- "subselect" = Agrupe su colección en una instrucción secundaria.

Mi primera pregunta, ¿cuál de las anteriores califica para el tipo de búsqueda ansiosa o lazyloading?

para criar a mis preguntas acerca de hibernación Las estrategias de recuperación del que estoy considerando debajo fragmento de código en mi clase Departamento

@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER,  orphanRemoval = true) 
@Fetch(value = FetchMode.SELECT) 
@BatchSize(size = 10) 
private Set<EmployeeData> employees = new HashSet<EmployeeData>(); 

Según mi entendimiento Tan pronto como he mencionado fetchType tan ansioso, me he quedado sólo con la join fetch estrategia, pero cuando menciono como fetchtype como lazyloading, tengo otras tres opciones, es decir, seleccionar, tamaño de lote y subselección. ¿Está de acuerdo? Ahora, si miro el fragmento de código en uno de mis proyectos heredados, mencionó el tipo de búsqueda como impaciente y traté la estrategia como selección, lo que se contradice entre sí. ¿Derecha?

Otra consulta es No veo la opción de tamaño de lote cuando escribo FetchMode. y controlas + espacio en eclipse aunque veo otras tres estrategias de búsqueda?

Respuesta

16

Las colecciones de hibernación tienen opciones de tipo de búsqueda y modo de búsqueda.

Fetch tipo especifica cuando se recuperan elementos de colección, a buscar a modo especifica cómo Hibernate los recupera.

Por lo tanto, FetchMode.SELECT y FetchMode.SUBSELECT son legales tanto con FetchType.EAGER como con FetchType.LAZY. La diferencia es que con FetchType.EAGER se ejecuta inmediatamente una consulta de selección adicional, mientras que con FetchType.LAZY se ejecuta después del primer acceso a la colección.

FetchMode.JOIN, sin embargo, no tiene sentido con FetchType.LAZY.

El tamaño del lote es una optimización adicional para FetchMode.SELECT, por lo que debe ser configurado por su propia anotación (@BatchSize) y no tiene nada que ver con FetchMode enumeración en sí.

Consulte también:

+0

aclaración increíble y rápida –

+0

+1 Fantástica respuesta –

0

El lote de tamaño = N es casi igual a la fetch = subselección. Déjeme explicar cómo lo hace así:

Suponga que tiene 10000 registros primarios y cada uno de ellos tiene 500 registros secundarios, y si se utiliza la estrategia de recuperación como subselección entonces esta es la forma en las consultas se vería así:

Subselección:
Seleccionar * del padre;
select * from child where child.Parent_Id in (seleccione Parent_Id from Parent).

Nota: Sólo en caso de si la cláusula IN excede el límite que es proporcionada por la base de datos subyacente, obviamente, la consulta anterior falla. Aquí está la situación donde el tamaño de lote entra en la imagen. Mediante el uso de por lotes podemos mencionar el número de Parent_Id que se participará en la cláusula IN.

& Seleccionar lotes de tamaño:
Seleccionar * de los padres;
select * from child where child.Parent_Id in (1,2,3,4 ...... hasta el límite de la cláusula IN del DB subyacente).
select * from child where child.Parent_Id in (1001,1002 ...... hasta el límite de la cláusula IN del DB subyacente).

Nota: lotes de tamaño deben usarse con fetch = seleccionar, pero no con fetch = subselección (ya que no tiene ningún sentido).

Cuestiones relacionadas