mysql - 与数据库触发器相比,Hibernate 的拦截器效率如何?

标签 mysql database performance hibernate triggers

I can't make MySQL to update a column with ON UPDATE ,我正在考虑使用 Hibernate's interceptors ,每次更新行时都会更新 updated 表。

我唯一关心的是,与让 MySQL 更新它的理想情况相比,这意味着多少性能损失?

最佳答案

不会有明显的性能损失,而且您也不需要拦截器。

我创建了一个example on GitHub为此。

您需要创建一个 JPA 回调监听器:

public class UpdatableListener {

    @PrePersist
    @PreUpdate
    private void setCurrentTimestamp(Object entity) {
        if(entity instanceof Updatable) {
            Updatable updatable = (Updatable) entity;
            updatable.setTimestamp(new Date());
        }
    }

}

它使用如下定义的接口(interface):

public interface Updatable {

    void setTimestamp(Date timestamp);

    Date getTimestamp();
}

然后您可以为所有实体定义一个基类:

@MappedSuperclass
@EntityListeners(UpdatableListener.class)
public class BaseEntity implements Updatable {

    @Column(name = "update_timestamp")
    private Date timestamp;

    @Override
    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public Date getTimestamp() {
        return timestamp;
    }
}

然后只需让您的实体扩展它即可:

@Entity(name = "Post")
@Table(name = "post")
public class Post extends BaseEntity {
    ...  
}

@Entity(name = "PostComment")
@Table(name = "post_comment")
public static class PostComment extends BaseEntity {
    ...  
}

当您修改这些实体时:

doInJPA(entityManager -> {
    Post post = entityManager.find(Post.class, 1L);
    post.setTitle("Post");
    for(PostComment comment : post.getComments()) {
        comment.setReview("Review");
    }
});

Hibernate 将负责设置 timestamp 列:

UPDATE  post
SET     update_timestamp = '2016-02-06 17:03:26.759' ,
        title = 'Post'
WHERE   id = 1
UPDATE  post_comment
SET     update_timestamp = '2016-02-06 17:03:26.76' ,
        post_id = 1 ,
        review = 'Review'
WHERE   id = 1
UPDATE  post_comment
SET     update_timestamp = '2016-02-06 17:03:26.76' ,
        post_id = 1 ,
        review = 'Review'
WHERE   id = 2

关于mysql - 与数据库触发器相比,Hibernate 的拦截器效率如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35229784/

相关文章:

php - SQL 数据透视表与 dayValue [处理数据透视表中的日期] MYSQL-解决方案

java多线程应用程序更新数据库

sql - SQL Server 中特定列的更改跟踪

mysql - docker-compose rails 与 mysql

php - 如何使用 Ajax 和 PHP 更新 MySQL 字段

java - 从数据库中搜索后对结果进行评分

performance - Impala 上的多维数据集运算符

javascript - 如何提高该功能的性能?

javascript - 基于 DOM 的 JS 路由是否更快,或者它只对组织有益?

mysql - 如何在一个查询中从三个表中获取数据,其中表 2 包含表 1 和 3 中的外键