当前位置: 首页 > 知识库问答 >
问题:

Hibernate 5和JPA:选择不带孩子的表,但在保存时保持持久性

阎德义
2023-03-14

我有两个模型: Ordine和DettaglioOrdine。我希望,当我保存一个类型为“Ordine”的对象时,Hibernate也保存他的孩子“DettaglioOrdine”(这是可行的)。但是,如果我做一个选择查询,查询非常慢,因为Hibernate也检索DettaglioOrdine。所以,我希望“Ordine”对象没有“DettaglioOrdine”对象。

"Ordine"模型:

@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();
        }

共有2个答案

李胤
2023-03-14

添加可选的=false在@OneTO许多注释的Ordine类.这可能工作。

optional=false是一条运行时指令。它的主要功能与延迟加载有关。除非记住设置optional=false,否则不能延迟加载非集合映射的实体(因为Hibernate不知道那里应该有代理还是null,除非告诉它null是不可能的,所以它可以生成代理)

魏硕
2023-03-14

这不是冬眠。您有fetch=FetchType。懒惰用于dettagliordine。Hibernate不必获取与父级的惰性关联。

问题可以在这里

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

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

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

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

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

您将拥有LazyPresalizationExcepton,并具有对懒惰关联的任何不必要的访问权限。

 类似资料:
  • 问题内容: 提交表单时出现此错误: org.hibernate.PersistentObjectException:分离的实体传递给持久化:com.project.pmet.model.Account; 嵌套异常是javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:c

  • 我正在@Async和@Transactional方法中的@Service类中执行一些持久化操作。 在这种方法中,我们持久化一些对象,然后在同一事务中持久化与这些已持久化对象相关的新对象。 JPA抛出一个异常,因为他认为这个相关对象没有被持久化: 这是我的服务类结构: 我想是与事务和异步方法有关,因为相同的代码在没有Async注释时工作。 我还尝试在Transactional注释中使用传播,但不起作

  • 问题内容: HSQL和Hibernate的新手知识… 其次是… 打印25000(活动中的“活动”对象的数量)。但是,当我再次运行此测试时,count(*)中的对象数量并没有增加(在程序开始时为0)。因此,不会持久地写入对象。 这是我的hsqldb连接字符串: 据我所知它不是内存数据库… 有谁知道为什么对象无法在单个JVM会话之后无法持久化?乐于提供更多信息,但是与Hibernate / JPA /

  • 问题内容: 我最近开始玩Play!Java框架1.2.3版(最新)。在测试框架时,尝试在名为的Hibernate实体中保留对象时遇到了一个奇怪的问题。地图对象映射长到Hibernate的实体,我呼吁,随着申报 我的问题如下:按照我的注释创建正确的表。但是,当对象持久化时,其中的数据就不会! 这是我用于实体的代码。首先是: 这里是: 这是我用来测试设置的课程: 表演!框架会自动为HTTP请求创建一个

  • 问题内容: 我最近开始玩Play!Java框架1.2.3版(最新)。在测试框架时,尝试在名为的Hibernate实体中保留对象时遇到了一个奇怪的问题。地图对象映射长到Hibernate的实体,我呼吁,随着申报 我的问题如下:按照我的注释创建正确的表。但是,当对象持久化时,其中的数据就不会! 这是我用于实体的代码。首先是: 这里是: 这是我用来测试设置的课程: 表演!框架会自动为HTTP请求创建一个

  • 我已经开始使用推荐的,并不再使用。其中一件我无法粘合的事情是使用持久的cookie存储。我只想在我的连接上附加一个定制的cookie处理程序/管理器来存储cookie。Android文档并没有太大帮助,因为它将有关cookie的主题概括为两行。 我之前一直在使用LoopJ的PersistentCookieStore,效果很好。 关于如何在Android中设置一个持久的cookie存储,我可以附加到