Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EclipseLink描述符定制器&;历史策略和JSF。如何在历史记录中插入用户主体?_Jsf_Jpa_Jakarta Ee_Eclipselink - Fatal编程技术网

EclipseLink描述符定制器&;历史策略和JSF。如何在历史记录中插入用户主体?

EclipseLink描述符定制器&;历史策略和JSF。如何在历史记录中插入用户主体?,jsf,jpa,jakarta-ee,eclipselink,Jsf,Jpa,Jakarta Ee,Eclipselink,在我的JSF web应用程序中,我使用了EclipseLink 描述符定制器 及 历史政策 在数据库中填充历史记录表。 相应的JPA实体类用@Customizer(beans.HistoryLesionhCustomizer.class) 历史记录表具有与源表相同的字段,加上两个字段(开始日期和结束日期),用于指定行上操作的开始和结束。 它正在充分发挥作用。但我需要的是填充历史表中的另一个字段。 我称之为user的此字段应填充用户主体,这将允许我跟踪执行CUD(创建/更新/删除)操作的用户。 我

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

描述符定制器

历史政策

在数据库中填充历史记录表。 相应的JPA实体类用
@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());

        }
    }
}