java - 在 Hibernate 中限制成员集合的大小

标签 java database hibernate

我有一个问题,因为我不知道是否可以限制 Activity 列表的大小。

我希望只检索最近的 5 个 Activity 。是否可以在从数据库中获取任何数据期间自动执行此操作? (这样我就不必在 Java 中手动限制集合)。

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @OrderBy("timestamp DESC")
    @JoinColumn(name = "PERSON_ID")
    private List<Activity> activities;


    // other setters, getters, etc. 
}

本质上,我想在 ACTIVITY 条目中保留 20 个条目(删除最旧的行,当插入新的行时),但只获取最新的 5 个。

这可能吗?

最佳答案

我会使用代码手动执行此规则。主要思想是集合 B 应该被很好地封装,以便客户端只能通过公共(public)方法(即 addB())更改其内容。只需在此方法 (addB()) 中确保此规则,以确保集合 B 中的条目数不能大于一个值。

@Entity
public class A {


    public static int MAX_NUM_B = 4;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<B> b= new LinkedHashSet<B>();

    public void addB(B b) {
        if (this.b.size() == MAX_NUM_B) {
            Iterator<B> it = this.b.iterator();
            it.next();
            it.remove();
        }
        this.b.add(b);
    }

    public Set<B> getB() {
        return Collections.unmodifiableSet(this.b);
    }
}


@Entity 
public class B{

    @ManyToOne
    private A a;
}

要点:
A should be the owner of the relationship.
In A , do not simply return B as client can bypass the checking logic implemented in addB(B b) and change its content freely.Instead , return an unmodifiable view of B .
In `@OneToMany` , set `orphanRemoval` to true to tell JPA to remove the B 's DB records after its corresponding instances are removed from the B collection.

另一种解决方案可能是

否决票

我认为您将不得不手动执行此操作。

想到的一种解决方案是在实体 A 中使用 @PrePersist 和 @PreUpdate 事件监听器。

在使用上述注释注释的方法中,检查 Set 的大小,如果它超过最大限制,则删除最旧的 B 条目(可能由 B 的 created_time 时间戳属性跟踪)

关于java - 在 Hibernate 中限制成员集合的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692033/

相关文章:

java - 如何通过iReport将数据集从主报表传递到子报表?

java - 如何按位置从数据库中删除行

java - 在测试用例中覆盖 hibernate sessionfactory 的数据源

sql - 如何在 SQLite 中的特定条件下进行 SQL 查询,将一个表的结果行与另一表的行组合起来

java - 从图像 URL 将图像保存到 MySql (Spring JPA Hibernate)

java.lang.NoSuchMethodError : org. hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/属性

java - Intellij 在鼠标悬停时不显示文档

java - 使用版本的 Hibernate 乐观锁定不起作用

java - 关于如何减少此代码片段中 'if' 语句的数量有什么建议吗?

database - perl 是否有任何数据库实现