我有一个实体可以引用另一个像这样的实体:
class School {
private boolean used = false;
}
class Student {
@ManyToOne
private School school;
}
属性used
表示School
实体是否使用,引用或不引用。因此,在创建时,School
实体应该used
为false,但一旦Student
引用它,used
必须变为true。是否有任何自动方式来执行此操作,如数据库中的触发器?
我尝试在这样的@PrePersist
实体上使用@PostPersist
和Student
,但它不起作用:
@PrePersist
public void prePersist(){
school.setUsed(true);
}
谢谢,
答案 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;
}