2011-03-28 8 views
22

Tengo una entidad de cuenta de usuario mapeada con una entidad de país. El mapeo de campo en la clase UserAccount es asíHibernate Emitir instrucción de selección incluso si FetchMode = Unir

@ManyToOne(fetch=FetchType.EAGER) 
@Fetch(FetchMode.JOIN) 
@JoinColumn(name="f_country_id", nullable=true, insertable=false, updatable=false) 
private Country country; 

Incluso hay fetchMode definido como Join, hibernación incendios separado Seleccione SQL a buscar países.

+0

¿Ha resuelto este problema? ¿Cómo te ayudó la respuesta aceptada? Estoy enfrentando el mismo problema, pero la respuesta aceptada no ayuda. –

+0

Por ansioso es simple. Lazy dejará de cargarlo. Entonces la respuesta es perfecta aquí. Una pequeña pega es que cuando tienes la relación N a Uno, no funciona. Así que tenemos que ir con la instrumentación bytecode y el modificador de propiedades de campo. Sin embargo, es una característica de la hibernación. –

+0

El problema, como sugieren el título y el contenido, es Hibernate emitiendo sentencias 'SELECT' para una relación' @ ManyToOne' con el tipo de búsqueda 'EAGER' cuando el modo fetch solicitado es' JOIN'. La respuesta aceptada establece que se elimine 'fetch = FetchType.EAGER' de la anotación, una acción que no cambiará nada ya que' EAGER' es el tipo de búsqueda predeterminado para la anotación; incluso si interpreta la respuesta como "change' EAGER' con 'LAZY'", eso no explica por qué Hibernate emite declaraciones 'SELECT' cuando se le ordena que no lo haga. –

Respuesta

19

Eliminar el fetch=FetchType.EAGER. Disparadores de búsqueda ansiosos en cascada seleccionan declaraciones.

+1

Necesito tenerlo ansioso. ¿Hay alguna manera de buscar ansioso con unirse ...? –

+1

Indicando el FetchMode.JOIN debería hacer el truco. Para obtener una carga ansiosa, use FetchType.EAGER o FetchMode.JOIN, use cualquiera, usar ambos es una sobre-muerte. El primero usa 'seleccionar' mientras que el último usar 'unirse'. –

+2

No resolvió el problema. Sigue disparando las sentencias seleccionadas a la base de datos. Estoy usando lo siguiente: @ManyToOne \t @Fetch (FetchMode.JOIN) \t @JoinColumn (name = "f_country_id", nullable = true, insertable = falso, actualizable = falso) \t private País del país; –

9

Satadru Biswas dio la respuesta en un comentario anterior.

Hibernate 3.x ignora la anotación fetchMode Cuando se utiliza la interfaz de consulta (session.createQuery) por lo que en este caso hay que añadir una cláusula FETCH combinación interna a la de la parte de la consulta.

Sin embargo, la interfaz de criterios utilizará esta interfaz correctamente.

3

Intento usar @Fetch (FetchMode.JOIN) hibernate la anotación en todas las API (JPQL y CriteriaBuilder) pero no funcionó. Sólo este código en servicio fino trabajo de clase:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class); 
Root<UserAccount> o = cq.from(UserAccount.class); 

o.fetch("country",JoinType.INNER); 

em.createQuery(cq.select(o)).getResultList(); 
0

estoy usando los criterios de consulta en busca de clientes.

public class PurchaseOrder 
{ 
    ..... 
    .....  
    @ManyToOne(fetch=FetchType.EAGER, optional=true) 
    @JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false) 
    @Fetch(FetchMode.JOIN) 
    @NotFound(action=NotFoundAction.IGNORE) 
    public ReportingCustomer getReportingCustomer() 
    { 
     return reportingCustomer; 
    } 
} 

Mientras que conseguir PurchaseOrder lo hace un LEFT OUTER JOIN de la siguiente manera

select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_ 
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID 
where ... 
  1. Cuando hay una entrada en ReportingCustomer - Se dispara únicamente la consulta anterior.
  2. Cuando no hay ninguna entrada para ese registro en ReportingCustomer - Se activa una consulta para cada consulta PURCHASEORDER (m + 1).

Uso el controlador "Progress" para conectar con DB. No estoy seguro de por qué se dispara m + 1 consultas solo en el escenario 2.

+0

Estoy experimentando el mismo problema: 'FetchMode.JOIN' funciona ya que encuentra uno, luego comienza con' SELECT's. ¿Encontraste una solución? –

Cuestiones relacionadas