如何使实体成为只读?

2022-08-31 11:19:36

使用 JPA 使实体只读的正确方法是什么?我希望我的数据库表永远不要以编程方式修改。

我想我明白我应该用.是否可以使用注释使我的实体在从数据库中检索后直接锁定?还是我必须搞砸并覆盖该特定实体的通用DAO?LockModeType.READ


答案 1

在您的实体中添加如下:EntityListener

@Entity
@EntityListeners(PreventAnyUpdate.class)
public class YourEntity {
    // ...
}

实现 您的 ,以便在发生任何更新时引发异常:EntityListener

public class PreventAnyUpdate {

    @PrePersist
    void onPrePersist(Object o) {
        throw new IllegalStateException("JPA is trying to persist an entity of type " + (o == null ? "null" : o.getClass()));
    }

    @PreUpdate
    void onPreUpdate(Object o) {
        throw new IllegalStateException("JPA is trying to update an entity of type " + (o == null ? "null" : o.getClass()));
    }

    @PreRemove
    void onPreRemove(Object o) {
        throw new IllegalStateException("JPA is trying to remove an entity of type " + (o == null ? "null" : o.getClass()));
    }
}

这将为您的实体创建一个具有 JPA 生命周期侦听器的防弹安全网。

  • 优点:JPA 标准 - 不是休眠特定的
  • 优点:非常安全
  • CON:仅显示运行时的写入尝试。如果需要编译时检查,则不应实现 setter。

答案 2

解决方案是使用基于字段的注释,将字段声明为仅建议公共 getter。这样做,您的对象无法更改。protected

(此解决方案不是特定于实体的,它只是构建不可变对象的一种方法)


推荐