2015-04-08 41 views
2

我正在使用Hibernate/JPA和QueryDSL。我在我的数据库表这样:更改@ManyToMany运行时的获取类型休眠关系

Proveedor

IdProveedor | RazonSocial 

Empresa与

IdEmpresa | Nombre 

ProveedorEmpresa

IdProveedor | IdEmpresa 

ProveedorEmpresa之间存在多对多关系。这是我的JPA映射:

PROVEEDOR

@Entity 
public class Proveedor { 

    private String idProveedor; 
    private String razonSocial; 
    @IgnoredField 
    private List<Empresa> empresas; 

    @Id 
    @Column(name = "IdProveedor") 
    public String getIdProveedor() { 
     return idProveedor; 
    } 

    public void setIdProveedor(String idEmpresa) { 
     this.idProveedor = idEmpresa; 
    } 

    @Basic 
    @Column(name = "RazonSocial") 
    public String getRazonSocial() { 
     return razonSocial; 
    } 

    public void setRazonSocial(String razonSocial) { 
     this.razonSocial = razonSocial; 
    } 

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "ProveedorEmpresa", joinColumns = { 
      @JoinColumn(name = "IdProveedor", nullable = false, updatable = false)}, 
      inverseJoinColumns = { 
        @JoinColumn(name = "IdEmpresa", nullable = false, updatable = false) 
      }) 
    public List<Empresa> getEmpresas() { 
     return empresas; 
    } 

    public void setEmpresas(List<Empresa> empresas) { 
     this.empresas = empresas; 
    } 

} 

EMPRESA

@Entity 
public class Empresa { 

    private String idEmpresa; 
    private String razonSocial; 
    private String abreviatura; 
    private List<Proveedor> proveedores; 

    @Id 
    @Column(name = "IdEmpresa") 
    public String getIdEmpresa() { 
     return idEmpresa; 
    } 

    public void setIdEmpresa(String idEmpresa) { 
     this.idEmpresa = idEmpresa; 
    } 

    @Basic 
    @Column(name = "RazonSocial") 
    public String getRazonSocial() { 
     return razonSocial; 
    } 

    public void setRazonSocial(String razonSocial) { 
     this.razonSocial = razonSocial; 
    } 

    @Basic 
    @Column(name = "Abreviatura") 
    public String getAbreviatura() { 
     return abreviatura; 
    } 

    public void setAbreviatura(String abreviatura) { 
     this.abreviatura = abreviatura; 
    } 

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "empresas") 
    public List<Proveedor> getProveedores() { 
     return proveedores; 
    } 

    public void setProveedores(List<Proveedor> proveedores) { 
     this.proveedores = proveedores; 
    } 
} 

我有这个方法返回所有Empresa他们Proveedor(因为急于获取):

public List<Empresa> getEmpresasWithProveedores() { 
     JPAQuery query = new JPAQuery(); 
     query.from(qEmpresa); 
     return query.list(qEmpresa); 
} 

现在,我想返回该其他方法的所有Empresa没有他们Proveedor

public List<Empresa> getEmpresasWithoutProveedores() { 
     // Set the fetch type to LAZY 
     JPAQuery query = new JPAQuery(); 
     query.from(qEmpresa); 
     return query.list(qEmpresa); 
} 

我已尝试添加一个FetchProfileEmpresa实体:

@Entity 
@FetchProfile(name = "WITH_PROVEEDORES", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = Empresa.class, association = "proveedores", mode = FetchMode.JOIN)}) 
public class Empresa { . . . } 

并启用/停用,然后再每种方法。但它不起作用,它有相同的行为。其实,我不明白FetchProfile是如何工作的,以及如何配置它以获得我想要的行为。

在此先感谢。

回答

1

假设您使用的是JPA 2.1,则需要使用与FetchProfile等效的JPA来执行相同的操作。

你的类是要这个样子

@Entity 
@NamedEntityGraph(
     name = "WITH_PROVEEDORES", 
       attributeNodes = { 
    @NamedAttributeNode("proveedores") 
} 
) 
public class Empresa { 
..... 

您可以运行这样的查询,

private static void queryWithProveedors() { 
    EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU"). 
      createEntityManager(); 
    QEmpresa qEmpresa = QEmpresa.empresa; 
    JPAQuery query = new JPAQuery (entityManager); 
    EntityGraph graph = entityManager.getEntityGraph("WITH_PROVEEDORES"); 
    query.from(qEmpresa).setHint("javax.persistence.fetchgraph", graph); 
    query.list(qEmpresa); 
    } 

在您不使用JPA 2.1的情况下,要么就得弄个休眠会话,然后使用FetchProfile或使用建议的方法here