2010-12-06 2 views
0

У меня есть объект, который имеет ссылку на другой, как это:Как автоматически обновить объект, когда объект сохраняется или обновлен

class School { 
    private boolean used = false; 
} 

class Student { 
    @ManyToOne 
    private School school; 
} 

Атрибут used указывает, что School объект используется ли, ссылка или нет. Поэтому при создании объект School должен иметь значение used false, но как только ссылка Student ссылается на него, значение used должно быть повернуто к истине. Есть ли какой-либо автоматический способ сделать это, как триггеры в базе данных?

Я пытаюсь использовать @PrePersist и @PostPersist на Student сущности, как это, но он не работает:

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

Спасибо,

ответ

2

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

class School { 
    private List<Student> students; 
} 

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

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

Это самое простое и умное решение для моего дела, спасибо брату! – 2010-12-06 14:31:39

0

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

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

Спасибо, что напомнили, но дело не в этом. Это происходит только тогда, когда вы сохраняете/обновляете/удаляете плеер, он сохраняет/обновляет/удаляет команду. – 2010-12-06 04:49:21

1

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

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