Pull to refresh

Comments 17

UPD: В примере была небольшая недосказанность — прослушивание было только для события saveOrUpdate, в то время, как могут быть вызваны и просто save и просто update. обновил тесты
Или можно воспользоватся аннотациями к примеру обновлять дату создания и модификации модели.

@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. Проблема реализации на родительском классе в том, что отнаследоваться можно только от одного класса.
Наследоваться не обязательно, как я написал можно прописывать всё в каждой моделе, но если вам нужно автоматом обновлять какие то поля как в Rails created_at и udated_at поля у каждой модели то лучше отнаследоваться чтобы не повторять код.

Меня другое смущает как вы в событие передаёте юзера который делает изменение. Пока то что у вас в коде захардкоден юзер с id 2
LastModified lastModified = new LastModified((User) userDao.get(2));
как-то так:
final User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Да про Spring Security с залогиненым юзером не подумал.
Наверное, есть случаи, где это удобно, но этот конкретный пример можно было сделать и на триггерах, упростив код.
я правильно понимаю — на триггерах в БД? тогда как бы вы получили текущего пользователя?
а разве у нас не один пользователь к БД подключается? вы же не предлагаете на каждого пользователя системы заводить отдельного пользователя БД?
вы же не предлагаете на каждого пользователя системы заводить отдельного пользователя БД?

Конечно же нет. Пользователь, работающий с БД, один, просто после успешной авторизации в системе, выполняется pl/sql процедура, в которую передается идентификатор текущего пользователя. В самой процедуре выполняется

dbms_session.set_context('MyApp', 'currentUserId', :user_id, USER)

Как-то так, приблизительно.
мне кажется, или пример с использованием PS/SQL более конкретен чем мой, т.к. будет привязан к конкретной СУБД или к ограниченному кругу СУБД, поддерживающих конкретный синтаксис PL/SQL?
Ну, я вообще-то изначально говорил про Оракл и про то, как можно получить текущего пользователя приложения на стороне БД. Во-вторых, использование триггеров в любом случае это привязка к СУБД.
триггер не обязательно должен быть в БД — мой пост тому пример.

и код, в случае с триггерами в БД, не упростится, а усложнится, т.к. будет включать в себя неявные «инъекции» внутри БД, влияющие на логику работы приложения.

Но это всё как карандаши/фломастеры/etc :)
В Вашем посте приведен пример слушателя. Триггер, конечно, тоже слушатель, но обычно, говоря «триггер» подразумевают его именно в БД.

З.Ы. Насчёт карандашей/фломастеров/etc полностью согласен
UPD: Обновил исходники — доработал пример с использованием Spring Data JPA (использовал только сущность org.springframework.data.jpa.domain.AbstractAuditable, без слушателей)
Слушателя org.springframework.data.jpa.domain.support.AuditingEntityListener не стал добавлять, чтобы сохранился пример с обработкой событий в Hibernate.
Sign up to leave a comment.

Articles