Comments 17
Или можно воспользоватся аннотациями к примеру обновлять дату создания и модификации модели.
Унаследовать модели от выше описанного класса, где хотим автоматом проставлять даты.
Или в каждой моделе ручками добавляем методы и соответственно переменные не забыть.
Про ваш способ не знал, возьму на заметку.
@MappedSuperclass
public abstract class AbstractEntity<PK extends Serializable> extends AbstractPersistable<PK> {
private static final long serialVersionUID = 1L;
@Column(nullable = false)
private Date createdDate;
@Column(nullable = false)
private Date updatedDate;
@PrePersist
public void onCreate() {
this.createdDate = new Date();
this.updatedDate = new Date();
}
@PreUpdate
public void onUpdate() {
this.updatedDate = new Date();
}
}
Унаследовать модели от выше описанного класса, где хотим автоматом проставлять даты.
Или в каждой моделе ручками добавляем методы и соответственно переменные не забыть.
@PrePersist
public void onCreate() {
this.createdDate = new Date();
this.updatedDate = new Date();
}
@PreUpdate
public void onUpdate() {
this.updatedDate = new Date();
}
Про ваш способ не знал, возьму на заметку.
конечно можно… если брать в пример только обновление даты или пользователя. Но ведь это только пример, показывающий как это использовать. В реальности там может заложена отдельная логика с дополнительными действиями.
кто-то может это сделать на аспектах и тоже будет по своему прав.
PS. Проблема реализации на родительском классе в том, что отнаследоваться можно только от одного класса.
кто-то может это сделать на аспектах и тоже будет по своему прав.
PS. Проблема реализации на родительском классе в том, что отнаследоваться можно только от одного класса.
Наследоваться не обязательно, как я написал можно прописывать всё в каждой моделе, но если вам нужно автоматом обновлять какие то поля как в Rails
Меня другое смущает как вы в событие передаёте юзера который делает изменение. Пока то что у вас в коде захардкоден юзер с id 2
created_at
и udated_at
поля у каждой модели то лучше отнаследоваться чтобы не повторять код.Меня другое смущает как вы в событие передаёте юзера который делает изменение. Пока то что у вас в коде захардкоден юзер с id 2
LastModified lastModified = new LastModified((User) userDao.get(2));
Наверное, есть случаи, где это удобно, но этот конкретный пример можно было сделать и на триггерах, упростив код.
я правильно понимаю — на триггерах в БД? тогда как бы вы получили текущего пользователя?
В оракле можно sys_context()(см. Context Demo) для этих целей использовать.
а разве у нас не один пользователь к БД подключается? вы же не предлагаете на каждого пользователя системы заводить отдельного пользователя БД?
вы же не предлагаете на каждого пользователя системы заводить отдельного пользователя БД?
Конечно же нет. Пользователь, работающий с БД, один, просто после успешной авторизации в системе, выполняется pl/sql процедура, в которую передается идентификатор текущего пользователя. В самой процедуре выполняется
dbms_session.set_context('MyApp', 'currentUserId', :user_id, USER)
Как-то так, приблизительно.
мне кажется, или пример с использованием PS/SQL более конкретен чем мой, т.к. будет привязан к конкретной СУБД или к ограниченному кругу СУБД, поддерживающих конкретный синтаксис PL/SQL?
Ну, я вообще-то изначально говорил про Оракл и про то, как можно получить текущего пользователя приложения на стороне БД. Во-вторых, использование триггеров в любом случае это привязка к СУБД.
триггер не обязательно должен быть в БД — мой пост тому пример.
и код, в случае с триггерами в БД, не упростится, а усложнится, т.к. будет включать в себя неявные «инъекции» внутри БД, влияющие на логику работы приложения.
Но это всё как карандаши/фломастеры/etc :)
и код, в случае с триггерами в БД, не упростится, а усложнится, т.к. будет включать в себя неявные «инъекции» внутри БД, влияющие на логику работы приложения.
Но это всё как карандаши/фломастеры/etc :)
Sign up to leave a comment.
Spring и обработка событий в Hibernate