【问题标题】:How can I add an element to a lazily-loaded collection in Hibernate without causing the collection to load?如何在 Hibernate 中将元素添加到延迟加载的集合而不导致集合加载?
【发布时间】:2010-10-24 15:48:36
【问题描述】:

锡纸上写着什么;我想在不强制加载集合的情况下在 Hibernate 中修改集合,因为它是大量数据(约 100,000 条记录,单调递增)。

现在,我通过调用 getEvents ().add (newEvent) 将一个元素添加到此列表中,这当然会导致填充 events

这是映射:

<bag name = "events" inverse = "true" cascade = "all-delete-orphan"
 order-by = "event_date desc" lazy = "true">
  <key>
<column name = "document_id" length = "64" not-null = "true" />
  </key>
  <one-to-many class = "EventValue" />
</bag>

我应该怎么做?

【问题讨论】:

    标签: java hibernate jpa lazy-loading


    【解决方案1】:

    实现此目的的一种方法是在父对象(我们称之为父对象)和事件之间创建双向关联,并配置您的休眠映射以使该关系由事件管理。

    要完成此操作,您的 Hibernate 映射应如下所示:

    <class name="Parent"...>
        ...
        <bag name="events" lazy="true" inverse="true"...>...</bag>
        ...
    </class>
    
    <class name="Event"...> 
        <many-to-one name="parent">
        ...
    </class>
    

    你的代码看起来会是这样的:

    myEvent.setParent(parentObject);
    eventDao.save(myEvent);
    

    希望这会有所帮助。祝你好运。

    【讨论】:

    • 在使用对象方面有什么副作用?
    • 这真的取决于你如何以及何时使用 Parent.getEvents() 的结果。您可能需要重新获取父级和/或将其从缓存中过期......但在大多数典型情况下,您不需要做任何特殊的事情,它会“正常工作”
    【解决方案2】:

    只需插入事件。

    例如:

    @Entity
    public Document
    {
        @ManyToOne
        Set<Event> events;
    
        public void addEvent( Event event )
        {
            events.add( event )
        }
    
    }
    
    
    @Entity
    public Event
    {
        @id
        private long id;
    
        @OneToMany
        private Document  doc;
    
        ....
    }
    

    可以读取所有事件的选项:

    document.add( event );
    update( document );
    

    不会触及集合的选项:

        event = new Event();
        event.setDocument( document );
        insert( event );
    

    然后,当您调用 document.getEvents() 时,它也会查询并获取新事件。唯一的问题是如果集合已被读取,然后您通过选项 2 插入事件。在这种情况下,getEvents() 将不包含新事件,因为集合已被读取。

    【讨论】:

    • 基本上是 blahspam 所说的内容。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多