2017-03-16 57 views
0

前进的感谢。的EclipseLink历史addEndFieldName

我在使用Eclipselink历史记录时遇到问题。 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起始日期END_DATE 30 2017年3月14日17:19:53.000 “” 30 2017年3月14日17:27:16.000 “” 30 2017年3月14日17:31:32.000 “”

end_date字段始终为空。删除操作也不会被插入到表中。

我无法理解它为什么会发生。我错过了什么吗?谢谢。

+0

空ENDFIELD似乎表明的最新变化。您的历史记录表仅显示一个ID字段 - ID不可修改,因此记录的历史记录方式不会太多。你如何去除实体? – Chris

+0

我已将id字段和start_date字段作为历史记录表的主键。我通过entityManager.remove方法删除 –

+0

打开日志并运行一个简单的测试。坚持一个新的实体在一个事务和提交,然后之后删除它在其他交易,并显示日志的EclipseLink生成 - 它应该记录它尝试使用SQL并可能给你的,为什么没有一个历史记录条目指示删除。 – Chris

回答

0

历史记录表的工作原理是当你持续一个新的实体时,一行进入历史表,显示这个数据的开始日期,但没有结束日期,因为数据仍然存在。当你改变某些东西时,以前的历史记录行会得到一个结束日期,并且会放入一个新条目以反映当前状态。当前状态总是有一个空的结束日期,因为它仍然是活动的。这使您可以审核更改,并在下次更新之前查看每次更改的时间以及它们的存在时间。

当您删除一行时,以前的历史记录行只会得到一个结束日期。那么历史记录表中应该没有行代表被删除的具有空结束日期的实体,因为没有当前的数据。

+0

非常感谢克里斯。历史表需要一个主键,如果我用auto_increment放置一个长ID,历史策略仍然知道要更新哪些行。 –

+0

我不是一个DBA,但什么是添加一个自动递增的ID字段,如果它不使用任何的意义呢?从技术上讲,该行有一个ID - 实体ID和开始日期 – Chris

+0

这意味着我必须在历史记录表中添加一个列的行ID。如果eclipselink可以即时创建历史记录表,那将非常棒。我了解暂时没有。我的历史记录表包含具有start_date和end_date的实体的确切镜像副本。我可能无法确定历史记录表的主键。非常感谢克里斯。 –