@Version还是Trigger?

时间:2015-04-07 09:15:13

标签: mysql hibernate spring-mvc triggers

我想在所有表中添加一个列'LastModification',此列将存储相关行的修改日期,我的Web应用程序中使用的框架是:SpringMVC,Hibernate和MySQL数据库。

我的问题是:

  • 新列的类型是:datetime还是timestamp?根据 我的研究,我没有发现datetime有更大的范围,但是 我可以拥有未来的风险或限制吗?
  • 侧面性能,为每个表添加触发器是否更好 将更新“LastModification”列,或者我必须更新 使用注释'版本?我试图实现版本,但我有一个 很多错误,解决方案需要更改现有注释 权利(即:cascade = CascadeType.ALL等等),我没有 改变它的权利:(所以我计划添加触发器,但我不知道是不是 会影响我的数据库的性能吗?

下面的脚本是我打算实现的触发器的一个示例:

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();

感谢您的回答。

2 个答案:

答案 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
} 

您可以阅读Spring Data JPA Auditing: Saving CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate automatically了解更多详情