您可以在代码中手动执行此操作,特别是 1 列。基本上,这个想法是在数据库中更新之前将日期更新为所需的日期。
为此,您需要在 Hibernate 的 EventListenerRegistry 中分配一个 listener。以下类将在执行保存操作之前应用CreateOrUpdateDateListener 侦听器(由您创建)。
@Component
public class HibernateEventWiring {
@Autowired
@Qualifier(value = "your_sessionFactory") //Your session factory
private LocalSessionFactoryBean sessionFactory;
@Autowired
private CreateOrUpdateDateListener listener;
@PostConstruct
public void registerListeners() {
EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory.getObject()).getServiceRegistry().getService(
EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.SAVE_UPDATE).appendListener(listener);
}
}
以下类扩展了 DefaultSaveOrUpdateEventListener 并添加了将时间戳更新为所需内容的自定义代码。而且,我们在EventListenerRegistry 中使用了它的对象作为监听器
@Component
public class CreateOrUpdateDateListener extends DefaultSaveOrUpdateEventListener {
@Override
public void onSaveOrUpdate(SaveOrUpdateEvent event) {
if (event.getObject() instanceof CreateUpdateTimestamp) {
CreateUpdateTimestamp record = (CreateUpdateTimestamp) event.getObject();
record.setUpdatedTimestamp(LocalDateTime.now(Clock.systemUTC()));
}
super.onSaveOrUpdate(event);
}
}
public interface CreateUpdateTimestamp {
public void setCreatedTimestamp(LocalDateTime date);
public void setUpdatedTimestamp(LocalDateTime date);
}
以下是实体类。这个类将实现CreateUpdateTimestamp,这样我们就可以通过CreateUpdateTimestamp在CreateOrUpdateDateListener中的引用来使用这个类。
@Entity
@Table(name = "transactions")
public class Transaction implements CreateUpdateTimestamp{
private LocalDateTime updatedTimestamp;
@Column(name = "updated_timestamp", insertable = true, updatable = true)
public LocalDateTime getUpdatedTimestamp() {
return updatedTimestamp;
}
public void setUpdatedTimestamp(LocalDateTime updatedTimestamp) {
this.updatedTimestamp = updatedTimestamp;
}
}