Как автоматически обновить сущность, когда сущность сохраняется или обновляется - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть объект, у которого есть ссылка на другой объект, подобный следующему:

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);
}

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Я думаю, что в школе также должен быть обратный список учеников. т.е.

class School {
   private List<Student> students;
}

Таким образом, когда школа загружена, вы можете легко получить доступ к списку учащихся. Тогда выяснить, используется ли школа, становится очень просто. Вам больше не понадобится логический флаг, просто так:

public boolean hasStudents() {
    return students.size() > 0;
}
1 голос
/ 06 декабря 2010

Один из способов - написать на вкладыше триггер обновления таблицы учеников, который проверит, держит ли кто-то ссылку на иностранный ключ в школу, и вам нужно будет проверить все школы здесь. Также сопоставьте использованную переменную со столбцом в школьной таблице. Если какой-либо ученик держит ссылку, сделайте столбец верным и вызовите обновление из уровня приложения.

Если подумать, проверьте, возможно ли это. Когда вам когда-нибудь понадобится логика для используемой переменной, убедитесь, что если вы можете написать HQL и, используя этот HQL, проверьте, используется ли эта конкретная школа кем-либо из учеников. Я думаю, что это более чистый подход, но, наконец, это вызов, основанный на требованиях:)

0 голосов
/ 06 декабря 2010

Кроме того, вам необходимо определить CascadeType .Смотрите пример ниже:

class Team {
  @OneToMany(mappedBy="team", cascade = CascadeType.ALL)
  Set players;
} 
class Player {
  @ManyToOne
  Team team;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...