java - 限制 JPA 中集合的大小

标签 java mysql hibernate jpa

假设我有这样一个实体

@Entity
Class A{
//fields

@Onetomany
Set<B> b; // 
}

现在,我如何限制集合中“B”的数量,当集合中有新条目时,最旧的条目将被删除,例如 removeEldestEntry我们有一个 LinkedHashMap。

我正在使用带有 Hibernate 的 MySQL 5.5 数据库。提前致谢。

编辑

我的目标是在任何时候该表中的条目数都不超过 N。 我拥有的一个解决方案是使用一个 Set 并安排一个作业来删除旧条目。但是我觉得很脏。我正在寻找更清洁的解决方案。

最佳答案

我会使用代码手动执行此规则。主要思想是集合 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 应该是关系的所有者。
  • 在 A 中,不要简单地返回 B,因为客户端可以绕过 addB(B b) 中实现的检查逻辑并自由更改其内容。相反,返回 B 的不可修改 View 。
  • 在 @OneToMany 中,将 orphanRemoval 设置为 true 以告知 JPA 在从 B 集合中删除相应实例后删除 B 的数据库记录。

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

相关文章:

java - WebLogic 12c 上的 JSF 2 中的 Stackoverflow 错误

java - 来自项目的 Maven 原型(prototype) - 如何保留包名称?

java - Java 中的 NFS 服务器

MySQL distinct+sort 查询性能问题

hibernate - 如何让 JUnit 4 注释在 Spring 2.5 中工作?

java - 如何将数据模型模拟注入(inject)到Spring Controller 中?

mysql - Web开发从哪里开始?

mysql - 如何通过运行批处理文件来启动 XAMPP MySQL?

java - 使用 Activiti 创建原生查询

spring - 在spring + hibernate中保存creationTimestamp和updatedTime