Hibernate 5 和 JPA:select table 没有他的 children 但在保存时保持持久性

Hibernate 5 and JPA: select table without his children but maintain persistence on save

我有两个模型:Ordine 和 DettaglioOrdine。 我希望这样,当我保存类型为“Ordine”的 object 时,hibernate 也会保存他的 child“DettaglioOrdine”(这有效)。 但是,如果我执行 select 查询,查询会非常非常慢,因为 hibernate 还会检索 DettaglioOrdine。所以,我想要没有“DettaglioOrdine”的“Ordine”object object。

“普通”型号:

@Entity
@Table(name="ordini")
@NamedQuery(name="Ordine.findAll", query="SELECT o FROM Ordine o")
public class Ordine extends DataObject<Integer> {
    private static final long serialVersionUID = 1L;
    private Integer id;
[...]
    private List<Dettagliordine> dettagliordine;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    //bi-directional many-to-one association to Dettagliordine
    @Column(insertable = true, updatable = true)
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="ordine")
    public List<Dettagliordine> getDettagliordine() {
        return this.dettagliordine;
    }

    public void setDettagliordine(List<Dettagliordine> dettagliordine) {
        this.dettagliordine = dettagliordine;
    }

    public Dettagliordine addDettagliordine(Dettagliordine dettaglioordine) {
        dettaglioordine.setOrdine(this);
        this.dettagliordine.add(dettaglioordine);

        return dettaglioordine;
    }

    public Dettagliordine removeDettagliordine(Dettagliordine dettagliordine) {
        dettagliordine.setOrdine(null);
        this.dettagliordine.remove(dettagliordine);
        
        return dettagliordine;
    

    }
}

DettaglioOrdine 型号:

@Entity
@Table(name="dettagliordine")
@NamedQuery(name="Dettagliordine.findAll", query="SELECT d FROM Dettagliordine d")
public class Dettagliordine extends DataObject<Integer> {
    private static final long serialVersionUID = 1L;
    private Integer id;
    
        [...]
        
    public Dettagliordine() {
    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    public Integer getId() {
        return this.id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    [...]
    
    //bi-directional many-to-one association to Ordini
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idOrdine", nullable=false)
    public Ordine getOrdine() {
        return this.ordine;
    }
    public void setOrdine(Ordine ordine) {
        this.ordine = ordine;
    }
}

这是我的查询:

SessionFactory sessionFactory = getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        List<OrdineDTO> result = null;
        try{
            String hql = "select d.ordine from Dettagliordine d "
                    + "group by d.ordine.id";
            Query<Ordine> query = session.createQuery(hql,Ordine.class);
            List<Ordine> res = query.getResultList();
            result = new OrdineDMO().unmarshall(res);
        }catch (DMOException e) {
            e.printStackTrace();
        }

它不是休眠。 dettagliordine 你有 fetch=FetchType.LAZY。 Hibernate 不必获取与父项的惰性关联。

问题可能出在这里

result = new OrdineDMO().unmarshall(res);

如果 unmarshall() 方法中的代码触及 dettagliordine 或调用不同于 get、set 方法(如 toString() 方法)的方法,Hibernate 将获取 dettagliordine协会。

您可以启用 Hibernate 日志记录并调试代码。您将看到何时实际进行提取。另请记住,如果您调试持久性 类,调试器可能会导致调用 toString() 方法,并且也会获取关联。

最好将此行移到 session/@Transactional 代码块之外。

result = new OrdineDMO().unmarshall(res);

您将有 LazyInitializationExcepton,对惰性关联有任何不需要的访问权限。