如何配置JPA禁止通过Employee实体更新Department代码表?
问题分析
问题根源在于:MapStruct将修改了deptName的DTO转换为Employee实体时,会生成一个带有合法id但name被篡改的Department对象。Hibernate持久化上下文会将该Department识别为托管状态,在事务提交时检测到属性变更,从而自动执行Department表的更新语句。
JPA层面解决方案
以下两种方案无需修改MapStruct映射逻辑,完全通过实体注解/配置实现禁止通过Employee操作更新Department的需求:
方案1:为Department实体添加@Immutable注解(Hibernate特有)
该注解标记整个Department实体为不可变,Hibernate会忽略对该实体的任何属性修改,不会生成对应的UPDATE语句,完美匹配“部门仅通过独立流程修改”的业务规则。
修改后的Department实体代码:
@Entity @Immutable public class Department { @Id private Long id; @Version private Integer version; @Column private String name; // 标准getter、setter、equals/hashcode实现 }
注意:若后续需通过独立流程修改
Department数据,需使用原生SQL、JDBC或Hibernate Session API绕过实体的不可变限制。
方案2:为Department的name字段设置@Column(updatable = false)(JPA标准)
通过JPA标准注解将name字段标记为不可更新,即使实体对象的name属性被篡改,Hibernate也不会生成更新该字段的SQL语句。
修改后的Department实体代码:
@Entity public class Department { @Id private Long id; @Version private Integer version; @Column(updatable = false) private String name; // 标准getter、setter、equals/hashcode实现 }
注意:该方式仅限制
name字段的更新,若后续新增其他需修改的字段可单独配置;若需修改name字段,同样需通过原生SQL等方式实现。
内容的提问来源于stack exchange,提问作者Timothy Vogel
相关产品推荐
相关产品推荐

