使用JPA将实体设为只读的正确方法是什么?我希望我的数据库表永远不会以编程方式进行修改。
我想我知道我应该用锁定我的对象LockModeType.READ
。从数据库检索后,是否可以使用注释使我的实体直接锁定?还是我必须弄乱并覆盖该特定实体的通用DAO?
Answers:
一种解决方案是使用基于字段的注释,将字段声明为,protected
并仅提出公共获取方法。这样做,您的对象无法更改。
(此解决方案不是特定于实体的,它只是构建不可变对象的一种方法)
在您的实体中添加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实现是休眠的-您可以使用休眠实体注释
@org.hibernate.annotations.Entity(mutable = false)
显然,这将使您的模型休眠。
declare error
方法,是的。仅当调用代码可用于AspectJ编译器时,此方法才有效。但是第一种方法仍然有效,因为它修改了实际的Entity类文件。