EclipseLink Descriptor Customizer & History Policy и JSF.Как вставить принципалы пользователя в историю? - PullRequest
3 голосов
/ 01 июля 2011

В моем веб-приложении JSF я использую EclipseLink

Дескриптор настройки

и

История политики

для заполнения таблицы истории в базе данных.Соответствующий класс сущностей JPA помечен @Customizer(beans.HistoryLesionhCustomizer.class)

Таблица истории имеет те же поля, что и исходная таблица, плюс два поля (start_date & end_date) для указания начала и конца операции в строке.Это полностью работает.Но мне нужно заполнить другое поле в таблице истории.Это поле, которое я назвал user , должно быть заполнено User Principals , и это позволит мне отследить пользователя, который выполнил операцию CUD (Создать / Обновить / Удалить).Я думал, что History Policy позволит мне добавить поле, просто указав его соответствующее имя в базе данных и указав значение объекта, которое должно быть вставлено.Но это не так, или, может быть, я не могу понять, как это можно сделать.Другими словами, наряду с start_date и end_date, я хочу заполнить поле пользователя:

FacesContext.getCurrentInstance (). GetExternalContext (). GetRemoteUser ();

package beans;

/**
 * Whenever there is a change on a record or an insert, change will be traced.
 * @author mediterran
 * 
 */
import javax.faces.context.FacesContext;
import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.history.HistoryPolicy;

public class HistoryLesionhCustomizer implements DescriptorCustomizer {

    @Override
    /**
     * Implementation method to use
     */
    public void customize(ClassDescriptor cd) throws Exception {
        String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();


        HistoryPolicy policy = new HistoryPolicy(); // Instantiates a new policy
//policy.postUpdate();
        policy.useDatabaseTime(); // Use the default database time to avoid date conflict
        policy.addHistoryTableName("history_lesionh"); // Indicate the source table name
        policy.addStartFieldName("start_date"); // indicate the start date DB column
        policy.addEndFieldName("end_date"); // Indicate the end date DB column
        cd.setHistoryPolicy(policy); // Use the Policy for the entity class where used @Customizer(HistoryLesionhCustomizer.class)



    }
}

Любая помощь илиобходные пути будут оценены.Спасибо

1 Ответ

7 голосов
/ 01 июля 2011

К сожалению HistoryPolicy добавляет только дату начала и окончания.Но вы можете добавить пользовательскую информацию в вашу сущность с помощью EntityListeners.Вот пример.Он будет добавлять информацию о пользователях к каждому персистенту / обновлению таблицы клиентов:

import javax.persistence.EntityListeners;

@Entity
@EntityListeners(AuditListener.class)
@Table(name = "customer")
public class Customer implements Serializable {
  @Column(name = "User")
  private String user;
  // getter and setter
}

и AuditListener:

import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
//...

public class AuditListener {
    @PrePersist
    @PreUpdate
    public void setUserInformation(Object entity) {
        if (entity instanceof Customer) {
            Customer myEntity = (Customer) entity;
            myEntity.setUser(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());

        }
    }
}

Если у вас есть более одного столбца, который требует информацию о пользователе,может использовать сущность MappedSuperclass и поместить столбец пользователя в этот класс.Затем позвольте всем вашим проверяемым сущностям расширить этот MappedSuperclass и проверьте в AuditListener, является ли сущность экземпляром суперкласса.

...