gpt4 book ai didi

jsf - EclipseLink Descriptor Customizer & History Policy 和 JSF。如何在历史记录中插入用户主体?

转载 作者:行者123 更新时间:2023-12-05 00:22:13 27 4
gpt4 key购买 nike

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

Descriptor Customizer

History Policy

在数据库中填充一个历史表。对应的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)



}
}

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

最佳答案

不幸的是,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 中检查该实体是否是父类(super class)的实例。

关于jsf - EclipseLink Descriptor Customizer & History Policy 和 JSF。如何在历史记录中插入用户主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com