EclipseLink描述符定制器&;历史策略和JSF。如何在历史记录中插入用户主体?
在我的JSF web应用程序中,我使用了EclipseLink 描述符定制器 及 历史政策 在数据库中填充历史记录表。 相应的JPA实体类用EclipseLink描述符定制器&;历史策略和JSF。如何在历史记录中插入用户主体?,jsf,jpa,jakarta-ee,eclipselink,Jsf,Jpa,Jakarta Ee,Eclipselink,在我的JSF web应用程序中,我使用了EclipseLink 描述符定制器 及 历史政策 在数据库中填充历史记录表。 相应的JPA实体类用@Customizer(beans.HistoryLesionhCustomizer.class) 历史记录表具有与源表相同的字段,加上两个字段(开始日期和结束日期),用于指定行上操作的开始和结束。 它正在充分发挥作用。但我需要的是填充历史表中的另一个字段。 我称之为user的此字段应填充用户主体,这将允许我跟踪执行CUD(创建/更新/删除)操作的用户。 我
@Customizer(beans.HistoryLesionhCustomizer.class)
历史记录表具有与源表相同的字段,加上两个字段(开始日期和结束日期),用于指定行上操作的开始和结束。
它正在充分发挥作用。但我需要的是填充历史表中的另一个字段。
我称之为user的此字段应填充用户主体,这将允许我跟踪执行CUD(创建/更新/删除)操作的用户。
我认为历史策略允许我添加一个字段,只需在数据库中指示其对应的名称,并指示必须插入的对象值。但事实并非如此,也许是因为我不知道如何才能做到这一点。
换句话说,除了开始日期和结束日期,我想用以下内容填充用户字段:
FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
任何帮助或解决办法都将不胜感激。
谢谢不幸的是
历史策略
只添加开始和结束日期。但是,您可以在一个应用程序的帮助下将用户信息添加到您的实体中。这里有一个例子。它将向customer表的每次持久化/更新添加用户信息:
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
}
听众:
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中检查该实体是否是该超类的实例。@Handy感谢Matt的及时反应?在应用您的解决方案之前,这意味着我需要在本例中的数据库源表(lesionh)中物理添加一列,该列由实体表示。While(history_lesionh)仅存在于数据库中,不表示为en实体,并且没有PK。我误解了吗?@Medi:您需要将用户列添加到(数据库)表、源表和历史表中。如果只有源表由实体表示,则只需修改此实体(无需为历史记录表创建实体类)。@Handy是的,我知道两个表上必须存在相同的列。因此,我需要在源表和历史表中添加一列“user”,这样历史表中添加的行将具有更新的用户值,该值将响应我的需要。好的我会尽快尝试,并给出反馈,接受你的解决方案,因为这似乎是我唯一的办法:)再次感谢马特。
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());
}
}
}