Como acessar vários inquilinos no eclipselink?

Inquilinos em eclipselink (ou Hibernate) são um ótimo conceito para separar domínios de dados uns dos outros. Eu estou usando eclipselink com estratégia de tabela única.

Às vezes, é necessário acessar dados de mais de um inquilino (por exemplo, para fins de administração). Existe uma boa maneira de conseguir isso? (Eu não quero percorrer todos os inquilinos para coletar os dados …)

Exemplo:

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

Eu posso acessar os objects em um locatário específico com um gerenciador de entidades parametrizado:

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

Existe alguma maneira conveniente de consultar todos os inquilinos? (Ou a identidade de um object persistente é definido apenas em um único locatário?)

O EclipseLink possui uma solicitação de recurso aberto para permitir uma maneira melhor de permitir que um servidor administrativo acesse dados de vários inquilinos: https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458 – vote nele se for importante você.

A maneira de contornar isso seria criar uma unidade de persistência separada para seu console de administração. Uma maneira de fazer isso seria mover os metadados de vários inquilinos para um arquivo EclipseLink orm.xml e usá-los em suas unidades de persistência de inquilinos, enquanto a unidade de persistência de administração apenas usa as classs de entidade. Você pode querer um campo nas entidades que podem ser mapeadas para a coluna de inquilino que o console administrativo poderia usar e consultar, mas ser somente leitura ou inacessível para as unidades de persistência específicas do inquilino.

Eu encontrei uma abordagem alternativa que testarei: em vez de usar a anotação @Multitenant para filtrar as entidades que pertencem ao meu locatário, usarei @AdditionalCriteria. Meu exemplo da pergunta acima se torna

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

Aqui eu preciso cuidar da coluna de inquilino eu mesmo. Eu posso criar dois gerentes de entidades. Um para access de inquilino:

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

E outro para access de administrador:

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

Veja detalhes para @AdditionalCriteria aqui . Algum comentário?