Hibernate Envers - передать настраиваемое поле - PullRequest
0 голосов
/ 11 апреля 2020

У меня проблема с Hibernate Envers. Как я могу передать пользовательские поля в RevisionListener? Например:

У меня есть объект с аннотацией @Audit, и все работает нормально. Но я понятия не имею, как я могу передать пользовательские поля, такие как «комментарий».

@Entity
@Table(name = "REVINFO")
@RevisionEntity(MyRevisionEntityListener.class)
public class RevEntity {
    @Id
    @RevisionNumber
    @Column(name = "REV", nullable = false, updatable = false)
    private Integer id;

    @RevisionTimestamp
    @Column(name = "REVTSTMP", nullable = false, updatable = false)
    private Date timestamp;

    @Column(name = "MODIFIED_BY", length = 100)
    private String modifiedBy;

    @Column(name = "COMMENT", length = 100)
    private String comment;
public class MyRevisionEntityListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        RevEntity a = (RevEntity) revisionEntity;
       a.setComment("");//how can i populate it?
    }
}

Итак, как я могу установить поле комментария?

Редактировать ---------

Я нашел какой-то трюк с ThreadLocal - но это безопасно с несколькими "активными пользователями"?

Например:

public class CustomComment {

    public static final CustomComment INSTANCE = new CustomComment();

    private static final ThreadLocal<String> storage = new ThreadLocal<>();

    public void setComment(String comment) {
        storage.set(comment);
    }

    public String get() {
        return storage.get();
    }
}

И у меня есть Служба, которая изменяет сущность:

CustomComment.INSTANCE.setComment("custom comment");
someRepository.save(someEntity);

Чем все работает, как я хочу. Но безопасно ли это решение? Если 2 или более чел. «Поменяют» разные сущности, будет ли это хорошо работать?

1 Ответ

1 голос
/ 11 апреля 2020

Чем все работает, как я хочу. Но безопасно ли это решение? Если 2 или более чел. «Меняют» разные сущности, будет ли это хорошо работать?

Если вы выполняете обновление в пределах @Transaction, тогда все в пределах границы транзакции будет происходить в одном потоке, поэтому у тебя все хорошо.

...