当前位置: 首页 > 面试题库 >

是否可以使用Hibernate或JPA注释来限制@OneToMany集合的大小?

严开宇
2023-03-14
问题内容

如果我在使用JPA /hibernate注释的POJO中具有以下映射的集合:

@OneToMany(mappedBy = "columnName", fetch = FetchType.LAZY)
@OrderBy("aField")
@MapKeyJoinColumn(name = "id_fk")
@LazyCollection(value = LazyCollectionOption.EXTRA)
private Set<PojoClass> collection = new HashSet<>();

是否可以将加载的集合的大小限制为特定的n个值,或者将页面大小设置为延迟加载集合的前n个元素,而不加载类的其他实例中的所有项目或任何其他项目(例如@BatchSize)?

请注意,该问题使用Criteria或以任何其他方式以编程方式限制显式查询的大小,从而显式地指向POJO映射,而不进行其他查询。

我一直在寻找的可能解决方案是在Hibernate中找到SQL
TOP语句的实现,希望作为批注或创建自定义CollectionPersister来修改生成的查询(尽管这需要在支持的方言中实现TOP语句)。


问题答案:

那不可能 Hibernate为您提供了两种选择:

  • 您在获取父实体时加载子对象集合
  • 您在第一次访问时会懒惰地加载子级集合

没有中间立场。这是因为Hibernate需要管理整个集合实体状态转换。如果您能够加载子集,那么单向袋就没有多大意义。

尽管可以使用@Where@Filter,但是这些注释对于过滤集合的内容(而不是限制其大小)更加有用。

因此,您必须始终记住,Hibernate集合是一项功能,而不是强制性要求。查询更加灵活,限制更少。

因此,这次您必须使用查询:

  • HQL / JPQL
  • 标准
  • 本机SQL


 类似资料:
  • 问题内容: 在具有两种类型的实体(父级和子级)的场景中: 父母-@OneToMany Collection孩子; 默认值为对子级集合进行延迟加载。这种模式对少数儿童非常有效,但是如果这个数字很大,这似乎是不可持续的。因此,在某些情况下,我认为孩子的数量会很大,因此我使用了分页的服务方法(例如“ getChildren(父父母,int偏移量,int计数)”)。 问题是:这是处理此类情况的最佳方法吗?

  • 我目前正在将我的项目从Hibernate HBM映射迁移到注释。就我应付小班而言,一切都很容易。但我有相同的大型类,我尝试为这个类混合映射和注释。我了解到,通过使用hibernate属性“hibernate.mapping.priority”并将其设置为“class,hbm”而不是“hbm,class”,这是可能的。(请参阅:在Hibernate中:可以为实体混合注释和XML配置吗?) 例如,我有

  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 在Hibernate中,要指定用于加入关联的列,请使用@JoinCol列注释,例如: 在大多数情况下,列的名称是用大写的类名加上。因此,从Hibernate自动派生它是合理的(例如,在Django的ORM中就是这样做的)。但这样的行为是以某种方式实施的吗?

  • 问题内容: 我在我们的项目和Hibernate Domain Pojo对象的基于注释的配置中使用Hibernate。对于基于注释的配置,我们有两个选择 使用基于JPA的注释 使用Hibernate本机注释 当前,我们对POJO文件使用基于JPA的注释配置,并使用Hibernate本机API(如SessionFactory,Session等)打开会话并执行数据库操作。 我有以下问题: 混合使用JPA

  • 问题内容: 我正在尝试使用JPA建立双向关系。我了解这是应用程序负责维护双方关系的责任。 例如,一个图书馆有多本书。在图书馆实体中,我有: 图书实体为: 不幸的是,OneToMany端的集合为空。因此,例如,对setLibrary()的调用失败,因为this.library.getBooks()。contains(this)导致NullPointerException。 这是正常行为吗?我应该自己