EclipseLink Descriptor Customizer & History Policy and JSF.如何在历史记录中插入用户主体?



在我的JSF web应用程序中,我使用EclipseLink

描述符自定义程序

历史策略

以填充数据库中的历史记录表。相应的JPA实体类用@Customizer(beans.HistoryLesionhCustomizer.class) 进行注释

历史记录表具有与源表相同的字段,外加两个字段(start_date&end_date(,用于指定对一行的操作的开始和结束。它正在充分发挥作用。但我需要的是填充历史表中的另一个字段。我称之为user的此字段应填充用户主体,这将允许我跟踪执行CUD(创建/更新/删除(操作的用户。我认为历史策略允许我添加一个字段,只需在数据库中指示其相应的名称,并指示必须插入的对象值。但事实并非如此,也可能是我不知道如何做到这一点。换句话说,除了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)

    }
}

如有任何帮助或解决办法,我们将不胜感激。感谢

不幸的是,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中检查该实体是否是该超类的实例。

相关内容

  • 没有找到相关文章

最新更新