如何在持久化或更新实体时自动更新实体

时间:2010-12-06 02:31:28

标签: java hibernate jpa ejb

我有一个实体可以引用另一个像这样的实体:

class School {
   private boolean used = false;
}

class Student {
   @ManyToOne
   private School school;
}

属性used表示School实体是否使用,引用或不引用。因此,在创建时,School实体应该used为false,但一旦Student引用它,used必须变为true。是否有任何自动方式来执行此操作,如数据库中的触发器?

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

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

谢谢,

3 个答案:

答案 0 :(得分:2)

我的想法是,学校也应该有一份相反的学生名单。即

class School {
   private List<Student> students;
}

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

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

答案 1 :(得分:1)

一种方法是在插入上写一个触发器,更新学生表,这将检查是否有人持有学校的外键引用,你必须在这里检查所有学校。还将已使用的变量映射到School表中的列。如果任何学生持有参考文献,则将该列设为true并从应用程序层调用刷新。

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

答案 2 :(得分:0)

此外,您需要定义 CascadeType 。 请参阅以下示例:

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