如何用@Customizer忽略字段避免触发EclipseLink历史表写入?
EclipseLink HistoryPolicy 忽略指定字段更新的实现方法
可行,你可以通过以下两种方式实现忽略指定字段,使其更新不触发历史表写入新行:
方法一:在HistoryPolicy中配置排除字段
在自定义器的customize方法里,通过HistoryPolicy的相关方法指定需要忽略的字段,既可以直接传入字段名,也可以通过类描述符获取字段对象,避免硬编码拼写错误。
修改后的自定义器代码:
public class MyCustomizer implements DescriptorCustomizer { @Override public void customize(ClassDescriptor cd) { HistoryPolicy policy = new HistoryPolicy(); policy.addHistoryTableName("history_table"); policy.addStartFieldName("start_ts"); policy.addEndFieldName("end_ts"); // 方式1:直接传入字段名 policy.excludeFields("fieldNotToBeTracked"); // 方式2:通过类描述符获取字段对象(更安全) // DatabaseField excludeField = cd.getFieldsByName("fieldNotToBeTracked").get(0); // policy.excludeField(excludeField); cd.setHistoryPolicy(policy); } }
方法二:使用@HistoryExclude注解(EclipseLink 2.7+)
如果你的EclipseLink版本是2.7或更高,可以直接在需要忽略的字段上标注@HistoryExclude注解,无需修改自定义器代码,配置更简洁直观。
修改后的实体类代码:
@Entity @Customizer(MyCustomizer.class) public class myClass { @Column(name = "field_To_Track") private Integer fieldToBeTracked; @Column(name = "field_Not_To_Track") @HistoryExclude // 添加该注解忽略此字段的历史跟踪 private Integer fieldNotToBeTracked; }
这两种方式都能达成目标:当仅更新fieldNotToBeTracked字段时,不会触发历史表写入新记录;只有更新被跟踪的字段(如fieldToBeTracked)时,才会生成历史条目。
内容的提问来源于stack exchange,提问作者renatompf
相关产品推荐
相关产品推荐

