【问题标题】:How to automatically update an entity when an entity is persisted or updated当实体被持久化或更新时如何自动更新实体
【发布时间】:2010-12-06 02:31:27
【问题描述】:

我有一个实体引用了另一个实体,如下所示:

class School {
   private boolean used = false;
}

class Student {
   @ManyToOne
   private School school;
}

used 属性表示School 实体是否已使用、是否引用。因此,在创建时,School 实体应该具有 used 假,但一旦 Student 引用它,used 必须变为真。有没有像数据库中的触发器一样自动执行此操作的方法?

我尝试在 Student 这样的实体上使用 @PrePersist@PostPersist 但它不起作用:

@PrePersist
public void prePersist(){
    school.setUsed(true);
}

谢谢,

【问题讨论】:

    标签: java hibernate jpa ejb


    【解决方案1】:

    我的想法是学校也应该有一个反向的学生名单。即

    class School {
       private List<Student> students;
    }
    

    因此,当学校加载时,您可以轻松访问学生列表。然后找出是否正在使用学校变得非常简单。您将不再需要布尔标志,只需:

    public boolean hasStudents() {
        return students.size() > 0;
    }
    

    【讨论】:

    • 这是最简单和最聪明的解决方案,谢谢兄弟!
    【解决方案2】:

    一种方法是在 Student 表的插入和更新上编写一个触发器,这将检查是否有人持有对学校的外键引用,您必须在此处检查所有学校。还将您使用的变量映射到学校表中的列。如果任何学生持有参考资料,则将该列设为真并从您的应用程序层调用刷新。

    再想一想,检查这是否可能。当您需要使用变量的逻辑时,请查看您是否可以编写 HQL 并使用该 HQL 检查该特定学校当前是否被任何学生使用。我认为这是一种更清洁的方法,但最后它是基于需求的调用:)

    【讨论】:

      【解决方案3】:

      此外,您需要定义 CascadeType。 请参见下面的示例:

      class Team {
        @OneToMany(mappedBy="team", cascade = CascadeType.ALL)
        Set players;
      } 
      class Player {
        @ManyToOne
        Team team;
      }
      

      【讨论】:

      • 谢谢你的提醒,但这不是重点。仅当您持久化/更新/删除玩家时,它也会持久化/更新/删除团队。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多