【问题标题】:Eclipselink history the addEndFieldNameEclipselink 历史 addEndFieldName
【发布时间】:2017-03-16 13:17:20
【问题描述】:

先谢谢大家了。

我在使用 Eclipselink History 时遇到问题。 addEndFieldName 始终为空。 addStartFieldName 具有正确的时间戳。它适用于插入和更新。当实体被删除时,历史表中没有条目。

请帮助我,我正在努力争取安静的时间

这是我的代码:

import org.eclipse.persistence.annotations.Customizer;

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "id_product")
private Integer idProduct;

.....

而 DescriptorCustomizer 是

public class TrackHistoryCustomizer implements DescriptorCustomizer {

    @Override
    public void customize(ClassDescriptor descriptor) {
        HistoryPolicy policy = new HistoryPolicy();
        policy.addHistoryTableName(descriptor.getTableName(), descriptor.getTableName() + "_history");
        policy.addStartFieldName("start_date");
        policy.addEndFieldName("end_date");
        policy.setShouldHandleWrites(true);
        descriptor.setHistoryPolicy(policy);
    }
}

这是我的历史记录表的输出

id_product start_date end_date 30 2017-03-14 17:19:53.000 "" 30 2017-03-14 17:27:16.000 "" 30 2017-03-14 17:31:32.000 ""

end_date 字段始终为空。删除操作也没有插入到表中。

我不明白为什么会这样。我错过了什么吗?谢谢。

【问题讨论】:

  • 空的 endField 似乎表示最新的更改。您的历史记录表仅显示一个 ID 字段 - ID 不可修改,因此记录的历史记录不会太多。您如何删除实体?
  • 我已将 id 字段和 start_date 字段作为历史表的主键。我正在通过 entityManager.remove 方法删除
  • 开启日志并运行一个简单的测试。在一个事务中保留一个新实体并提交,然后在另一个事务中删除它并显示 EclipseLink 生成的日志 - 它应该记录它尝试使用的 SQL,并且可能会告诉您为什么没有历史条目删除。
  • 当我坚持生成的查询如下 INSERT INTO product_history (id_product, active, country_market, data_status, date_created, date_modified, doseage_form, group_code, manufacturer, product_code, product_description, product_name,strength, email_id, id_language_code , id_status, packaging_size, start_date) 没有 end_date。当我删除时,我得到以下 UPDATE product_history SET end_date = ? WHERE ((end_date IS NULL) AND (id_product = ?)) 并且没有 start_date。我真的不知道发生了什么。非常感谢@Chris

标签: java eclipselink


【解决方案1】:

历史记录表的工作原理是,当您持久化一个新实体时,历史记录表中会出现一行显示此数据的开始日期,但没有结束日期,因为数据仍然存在。当您更改某些内容时,前一个历史记录行将获得一个结束日期,并放入一个新条目以反映当前状态。当前状态始终具有空结束日期,因为它仍然处于活动状态。这使您可以审核更改并查看每次更改的时间以及在下一次更新之前它们存在多长时间。

当您删除一行时,前一个历史记录行只会获得一个结束日期。那么历史表中不应该有任何行表示已删除的具有空结束日期的实体,因为它没有当前数据。

【讨论】:

  • 非常感谢克里斯。历史表需要一个主键,如果我把一个长id加上auto_increment,历史策略仍然知道要更新哪些行。
  • 我不是 DBA,但是如果它没有被任何东西使用,那么添加一个自动递增的 id 字段有什么意义呢?从技术上讲,该行有一个 ID - 实体 ID 和开始日期
  • 这意味着我必须在历史表中添加一列row-id。如果 eclipselink 可以动态创建历史表,那就太好了。我暂时不明白。我的历史表包含具有 start_date 和 end_date 的实体的精确镜像副本。我在确定历史表的主键时遇到了麻烦。非常感谢克里斯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 2023-03-20
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多