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