使用JPA注释表达审计功能

时间:2013-07-23 06:57:54

标签: java jpa ejb

我正在与JPA摸索。到目前为止,我已成功创建了一个表示用户数据的实体和一个用于访问用户数据的无状态bean。

用户可以使用的数据是这样的(SQLFiddle link):

CREATE TABLE data
(
  email character varying(128) NOT NULL,
  data character varying(128) NOT NULL,
  lastchange timestamp NOT NULL,
  CONSTRAINT email_data PRIMARY KEY (email,data)
);

我们的想法是使用空email密钥为所有用户保存未更改的当前版本。然后,当用户更改数据并创建可审核版本时,email字段将填入用户电子邮件。这样,每个用户都可以更改其数据副本。合并是一个问题,以后的日期,而不是我的问题的一部分。

现在,我已经有了实体。我创建了一个无状态bean来使用EntityManager加载/保存/查找数据记录。首先加载用户特定版本的逻辑,然后加载未更改的版本,如果用户没有用户特定版本仍然无法使用。

考虑这部分bean:

@Stateless
public class DataBean {

    @PersistenceContext(unitName = "authPU")
    private EntityManager em;

    public List<DataEntry> findAll() {
        TypedQuery<DataEntry> query = em.createQuery("SELECT d FROM data d", DataEntry.class);
        List<DataEntry> list = query.getResultList();
        return query.getResultList();
    }

    ...
}

如何将用户信息注入此课程?我需要先获取当前用户的数据,然后在没有用户特定数据的情况下获取所有用户的数据。

1 个答案:

答案 0 :(得分:0)

您可以使用标准EJB身份验证。然后,您可以在会话bean中调用SessionContext.getCallerPrincipal()以获取用户ID。使用此用户ID查询数据库。

在这种情况下,如果身份验证用户ID不等于电子邮件地址,则必须向表中添加另一列(包含用户ID)。

更简单(但不那么优雅)是将电子邮件地址添加到EJB服务方法的参数中:只需将其作为公共API的一部分。