我想在所有表中添加一个列'LastModification',此列将存储相关行的修改日期,我的Web应用程序中使用的框架是:SpringMVC,Hibernate和MySQL数据库。
我的问题是:
下面的脚本是我打算实现的触发器的一个示例:
CREATE TRIGGER trg_i_table001
BEFORE INSERT ON table001
FOR EACH ROW SET NEW.lastModification = Now();
CREATE TRIGGER trg_u_table001
BEFORE UPDATE ON table001
FOR EACH ROW SET NEW.LastModification = Now();
感谢您的回答。
答案 0 :(得分:2)
您是希望提供乐观锁定还是仅在修改记录时进行录制?
不要对MySQL使用@Version
个时间戳,因为如果您更快地更新相同的记录(时间戳值的分辨率低),它将抛出异常。始终将int
与@Version
一起使用。
如果只有一个应用程序写入数据库,则可以将逻辑保留在应用程序中。如果有多个应用程序,请使用db(触发器)。
如果您可以使用Spring Data JPA审核功能,那么您可能会节省大量时间:
http://docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/#auditing
这允许您向SDJ将自动为您更新的字段添加@LastModifiedDate
注释。允许您在登录时跟踪用户的身份。
答案 1 :(得分:0)
您可以使用Spring Data JPA,Spring可以在您的字段上使用注释@CreatedBy, @CreatedDate, @LastModifiedBy, @LastModifiedDate
轻松实现。您可以按照以下简单示例
// Will need to enable JPA Auditing
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
class JpaConfig {
// Creating a bean of AuditorAwareImpl which will provide currently logged in user
@Bean
public AuditorAware<String> auditorAware() {
return new AuditorAwareImpl();
}
}
// Moving necessary fields to super class and providing AuditingEntityListener entity listner class
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
abstract class Auditable<U> {
@CreatedBy
protected U createdBy;
@CreatedDate
@Temporal(TIMESTAMP)
protected Date createdDate;
@LastModifiedBy
protected U lastModifiedBy;
@LastModifiedDate
@Temporal(TIMESTAMP)
protected Date lastModifiedDate;
// Getters and Setters
}
// Creating implementation of AuditorAware and override its methods to provide currently logged in user
class AuditorAwareImpl implements AuditorAware<String> {
@Override
public String getCurrentAuditor() {
return "Naresh";
// Can use Spring Security to return currently logged in user
// return ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername()
}
}
@Entity
class File extends Auditable<String> {
@Id
@GeneratedValue
private Integer id;
private String name;
private String content;
// Getters and Setters
}