1

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

用户可以处理的数据是这样的(SQLFiddle 链接):

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字段将填充用户电子邮件。这样,每个用户都可以更改他们的数据副本。合并是以后的问题,而不是我的问题的一部分。

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

考虑 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();
    }

    ...
}

如何将用户信息注入此类?我需要先获取当前用户的数据,如果没有可用的用户特定数据,则获取所有用户的数据。

4

1 回答 1

0

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

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

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

于 2013-07-24T12:45:43.157 回答