Почти во всех классах Entity в моем приложении есть поле Timestamp для сохранения времени, когда Пользователь был изменен пользователем. Для этого поведения я использую простой метод, аннотированный @PreUpdate
, чтобы установить значение этого поля в текущий java.util.Date
.Редактирование объекта без выполнения метода @PreUpdate
Эта базовая функциональность исключается в некоторый класс BasicEntity, который я расширяю для конкретной реализации. Так что в основном выглядит следующим образом:
@MappedSuperclass
public abstract class BasicEntity {
// ...
@PreUpdate
public void preupdate() {
this.lastupdate = new java.util.Date();
}
}
@Entity
public class User extends BasicEntity {
private java.util.Date lastlogin;
}
Теперь у меня есть требование не только сэкономить время последнего действия обновления, но и время, когда пользователь входит в систему в систему. Итак, в настоящее время, с моим методом входа в систему, я устанавливаю поле для последнего входа в текущую дату и сохраняю текущее состояние этого экземпляра пользователя через EntityManager. Но тогда, конечно, поле для последнего обновления также устанавливается из-за моего метода @PreUpdate
.
Я не хочу, чтобы это произошло в этом конкретном случае! Как-то я хочу иметь возможность изменить значение поля lastlogin
, не изменяя значение поля lastupdate
.
У вас есть предложение, как я мог бы добиться этого в этом случае? Из-за большого количества дополнительных функций, предоставляемых BasicEntity
, я хотел бы избежать возврата от его расширения.
Текущая попытка:
@MappedSuperclass
public abstract class BasicEntity {
// ...
@PreUpdate
public void preupdate() {
this.lastupdate = new java.util.Date();
}
}
@Entity
public class User extends BasicEntity {
@Transient
protected volatile transient boolean login = false;
@Override
@PreUpdate
public void preupdate() {
if (!login) {
super.preupdate();
}
login = false;
}
}
В моем Входе-методе, который я делаю следующее:
getUser().setLogin(true);
userFacade.edit(getUser());
Но теперь, когда метод preupdate() Пользователь выполняется, значение login
по-прежнему false
.
Я бы создал новую сущность 'UserLogin', с помощью множества-к-одному для вашего объекта' User' и вместо этого вставлял в нее значения для логинов. –
Не будет ли это ссылаться на некоторую операцию em.merge на 'User' в любом случае и, таким образом, вызвать метод' @ PreUpdate'? – stg