如何在eclipselink中访问多个租户?

时间:2014-03-19 00:01:41

标签: java jpa eclipselink multi-tenant

eclipselink(或Hibernate)中的租户是将数据域彼此分开的一个很好的概念。我正在使用eclipselink和单表策略。

有时需要从多个租户访问数据(例如,出于管理目的)。有没有一个很好的方法来实现这一目标? (我不想通过所有租户来收集数据......)

示例:

@Entity
@Multitenant
@TenantDiscriminatorColumn(name = "TENANT", contextProperty = "tenant.id")
public class TenantEntity {
    ...

我可以使用参数化实体管理器访问特定租户中的对象:

private static EntityManager newEntityManager(String tenant) {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("tenant.id", tenant);
    return emf.createEntityManager(map);
}

有没有方便的方法来查询所有租户? (或者是仅在单个租户中定义的持久对象的标识?)

2 个答案:

答案 0 :(得分:2)

EclipseLink有一个开放的功能请求,允许更好的方式允许管理服务器访问多租户数据:https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458 - 如果它对您很重要,请投票给它。

解决方法是为管理控制台创建一个单独的持久性单元。解决此问题的一种方法是将多租户元数据移动到EclipseLink orm.xml文件,并在租户persitence单元中使用它,而管理持久性单元只使用实体类。您可能希望实体中的字段可以映射到管理控制台可以使用和查询的租户列,但是对于特定于租户的持久性单元而言是只读的或不可访问的。

答案 1 :(得分:2)

我找到了一种替代方法,我将尝试:不使用@Multitenant注释来过滤掉属于我的租户的那些实体,我将使用@AdditionalCriteria。我上面问题的例子变成了

@Entity
@AdditionalCriteria(":ADMINACCESS = 1 or this.tenant=:TENANT")
public class TenantEntity {

    private String tenant;
    ...

我需要自己处理租户专栏。 我可以创建两个实体管理器。一个用于租户访问:

private static EntityManager newEntityManager(String tenant) {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("TENANT", tenant);
    map.put("ADMINACCESS", 0);
    return emf.createEntityManager(map);
}

另一个用于管理员访问:

private static EntityManager newEntityManager() {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("TENANT", "");
    map.put("ADMINACCESS", 1);
    return emf.createEntityManager(map);
}

查看@AdditionalCriteria here的详细信息。有什么意见吗?