2016-02-16 12 views
2

Мы только начали использовать Hibernate Envers, и она хорошо работает для входа , что изменилось, однако, есть способ, которым он может также войти когда произошло изменение?Hibernate Envers - включает в себя дату, когда изменение произошло

Итак, может ли он добавить столбец datetime в таблицу аудита?

Согласно документации Envers, это должно произойти по умолчанию:

Когда Envers запускает новую версию, она создает новый объект ревизии, которая хранит информацию о ревизии. По умолчанию это включает только

  • номер ревизии - целочисленное значение (int/целое или длинное/длинное). По сути, первичный ключ ревизионной метки времени - длинное/длинное или java.util.Date значение, представляющее момент, когда была произведена ревизия. При использовании java.util.Date вместо длинной/длинной для временной отметки ревизии старайтесь не хранить ее в виде данных столбца, который потеряет точность.

Итак, мое понимание, что нет необходимых действий, необходимых для получения пересмотра метки времени. Однако в моем случае в таблицах, созданных с помощью envers, отсутствует метка времени ревизии.

Благодаря

+1

Прочтите руководство? https://docs.jboss.org/hibernate/envers/3.6/reference/en-US/html/revisionlog.html –

+0

Спасибо Алану, согласно документации Evners добавляет временную метку ревизии по умолчанию. Однако в моем случае это не отображается. – Magick

ответ

1

Вы должны определить пользовательский RevisionEntity для использования Envers, так что вы можете добавить атрибуты, которые необходимо. Необходимо аннотировать класс, делать вид, чтобы использовать как пользовательские ревизии объекта:

@RevisionEntity (AuditingRevisionListener.class)

В сущности вы можете определить, что вам нужно. Например, это должно быть хорошей отправной точкой:

@Entity 
@Table(name = "DATA_REVIEW_TABLE") 
@RevisionEntity(AuditingRevisionListener.class) 
public class AuditedRevisionEntity { 
    @RevisionNumber 
    @Id 
    @SequenceGenerator(name = "revisionSeq", sequenceName = "REVISION_DATOS_ID_SEQ", allocationSize = 1, initialValue = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "revisionSeq") 
    private int id; 

    @RevisionTimestamp 
    private Date modifiedAt; 
    private String username; 

    public int getId() { 
    return id; 
    } 

    public void setId(int id) { 
    this.id = id; 
    } 

    public String getUsername() { 
    return username; 
    } 

    public void setUsername(String username) { 
    this.username = username; 
    } 

    @Temporal(value = TemporalType.TIMESTAMP) 
    public Date getModifiedAt() { 
    return modifiedAt; 
    } 

    public void setModifiedAt(Date modifiedAt) { 
    this.modifiedAt = modifiedAt; 
    } 

} 

Кроме того, вы должны определить Revision слушателю обрабатывать, как данные инициализации в вашей пользовательской ревизии объекта. Ваш слушатель должен реализовать RevisionListener.

public class AuditingRevisionListener implements RevisionListener { 
    private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName()); 

    @Override 
    public void newRevision(Object revisionEntity) { 
    AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity; 
    String userName = null; 
    try { 
     if (SecurityContextHolder.getContext().getAuthentication() != null) { 
     Object principal = getCurrentUserInfo(); 
     if (principal == null) { 
      userName = "system"; 
     } else if (principal instanceof User) { 
      userName = ((User) principal).getUsername(); 
     } 
     } 
    } catch (Exception e) { 
     log.error("Error auditing username.", e); 
    } 
    revEntity.setUsername(userName); 
    revEntity.setModifiedAt(new Date()); 
    } 
} 

Имейте в виду, что эти классы должны быть по спячки подъезд, проверить это: Why Hibernate Envers is ignoring my custom RevisionEntity?

+0

Спасибо @ Рикардо, это очень полезно. Однако я не понимаю, зачем мне это нужно, так как согласно документам Envers временная метка ревизии должна быть предоставлена ​​из коробки. – Magick

2

Существует таблица создается автоматически Envers имени: REVINFO, который содержит метку времени.

Он содержит REV в качестве ключа, который является номером вашего пересмотра в таблице «_AUD». Этот номер уникален между всеми «столами» _AUD.

См. Пункт: 15.8. Понимание схемы Envers в https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch15.html