gpt4 book ai didi

hibernate - hibernate -如何在不加载整个Collection的情况下持久存储Collection中的新项目

转载 作者:行者123 更新时间:2023-12-03 12:15:33 24 4
gpt4 key购买 nike

我的模型中有一个集合,其中包含根域对象的一组“先前版本”。因此,以前的版本是“不可变的”,我们永远都不想更新它们,而只想在它们出现时添加过去的版本。同样,“版本化”域对象相当复杂,并且导致大量的数据库访问得以检索。
当我拥有这些对象之一的新版本时,我想与其他对象一起保存而不加载整个集合。高级常见问题解答对此有一些建议:

Why does Hibernate always initialize a collection when I only want to add or remove an element?

Unfortunately the collections API defines method return values that may only be computed by hitting the database. There are three exceptions to this: Hibernate can add to a <bag>, <idbag> or <list> declared with inverse="true" without initializing the collection; the return value must always be true.

If you want to avoid extra database traffic (ie. in performance critical code), refactor your model to use only many-to-one associations. This is almost always possible. Then use queries in place of collection access.


我对所有这些都是新手,不确定如何重构模型以仅使用多对一关联。谁能给我一个例子,向我指出一个教程,以便我可以学习如何解决我的问题?

最佳答案

当您有一个基于列表或基于集合的集合并将新对象添加到集合中时,Hibernate将始终访问数据库,因为它在保存或更新之前(使用集合时)或使用使用列表时的索引列。由于Set and List语义,因此需要此行为。因此,无论是否有很多记录,应用程序的性能都会大大降低。

一些解决此问题的方法

转换模式,方法是使用封装的Bag集合以及所需的Set或List作为属性公开

@Entity
public class One {

private Collection<Many> manyCollection = new ArrayList<Many>();

@Transient
public Set<Many> getManyCollectionAsSet() { return new HashSet<Many>(manyCollection); }
public void setManyCollectionAsSet(Set<Many> manySet) { manyCollection = new ArrayList<Many>(manySet); }

/**
* Keep in mind that, unlike Hibernate, JPA specification does not allow private visibility. You should use public or protected instead
*/
@OneToMany(cascade=ALL)
private Collection<Many> getManyCollection() { return manyCollection; }
private void setManyCollection(Collection<Many> manyCollection) { this.manyCollection = manyCollection; }

}

使用ManyToOne代替OneToMany
@Entity
public class One {

/**
* Neither cascade nor reference
*/

}

@Entity
public class Many {

private One one;

@ManyToOne(cascade=ALL)
public One getOne() { return one; }
public void setOne(One one) { this.one = one }

}

3度缓存-由于根据您的要求,您的配置可能会提高或降低应用程序的性能,因此被应用。参见 here

SQL约束-如果您想要一个行为类似于Set的集合,则可以使用SQL约束,该约束可以应用于一列或一组列。参见 here

关于hibernate - hibernate -如何在不加载整个Collection的情况下持久存储Collection中的新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com