You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/01/15 16:19:26 UTC

[isis] branch master updated: ISIS-2480: SecMan/JPA: convert trivial named queries

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new d42d83d  ISIS-2480: SecMan/JPA: convert trivial named queries
d42d83d is described below

commit d42d83d54a852d8d7910bd6e17d40039ca85793e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 15 17:19:10 2021 +0100

    ISIS-2480: SecMan/JPA: convert trivial named queries
---
 .../secman/jpa/dom/constants/NamedQueryNames.java  |  41 +++++++++
 .../jpa/dom/permission/ApplicationPermission.java  | 100 +++++++++++----------
 .../ApplicationPermissionRepository.java           |  11 +--
 .../secman/jpa/dom/role/ApplicationRole.java       |  53 ++++++-----
 .../jpa/dom/role/ApplicationRoleRepository.java    |   5 +-
 .../secman/jpa/dom/tenancy/ApplicationTenancy.java |  62 ++++++-------
 .../dom/tenancy/ApplicationTenancyRepository.java  |   7 +-
 .../secman/jpa/dom/user/ApplicationUser.java       | 100 +++++++++++----------
 .../jpa/dom/user/ApplicationUserRepository.java    |   9 +-
 9 files changed, 221 insertions(+), 167 deletions(-)

diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/constants/NamedQueryNames.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/constants/NamedQueryNames.java
new file mode 100644
index 0000000..d8a35a1
--- /dev/null
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/constants/NamedQueryNames.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.jpa.dom.constants;
+
+public final class NamedQueryNames {
+
+    public static final String PERMISSION_BY_FEATURE = "ApplicationPermission.findByFeature";
+    public static final String PERMISSION_BY_ROLE = "ApplicationPermission.findByRole";
+    public static final String PERMISSION_BY_ROLE_RULE_FEATURE = "ApplicationPermission.findByRoleAndRuleAndFeature";
+    public static final String PERMISSION_BY_ROLE_RULE_FEATURE_FQN = "ApplicationPermission.findByRoleAndRuleAndFeatureAndFqn";
+    public static final String PERMISSION_BY_USER = "ApplicationPermission.findByUser";
+    
+    public static final String ROLE_BY_NAME = "ApplicationRole.findByName";
+    public static final String ROLE_BY_NAME_CONTAINING = "ApplicationRole.findByNameContaining";
+    
+    public static final String TENANCY_BY_NAME = "ApplicationTenancy.findByName";
+    public static final String TENANCY_BY_PATH = "ApplicationTenancy.findByPath";
+    public static final String TENANCY_BY_NAME_OR_PATH_MATCHING = "ApplicationTenancy.findByNameOrPathMatching";
+    
+    public static final String USER_BY_USERNAME = "ApplicationUser.findByUsername";
+    public static final String USER_BY_EMAIL = "ApplicationUser.findByEmailAddress";
+    public static final String USER_FIND = "ApplicationUser.find";
+    public static final String USER_BY_ATPATH = "ApplicationUser.findByAtPath";
+
+}
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
index fd409c7..16c1ae2 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
@@ -26,9 +26,14 @@ import java.util.function.Function;
 import javax.inject.Inject;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -51,62 +56,59 @@ import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole;
+import org.apache.isis.persistence.jpa.applib.integration.JpaEntityInjectionPointResolver;
 
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.UtilityClass;
 
-//@javax.jdo.annotations.PersistenceCapable(
-//        identityType = IdentityType.DATASTORE,
-//        schema = "isisExtensionsSecman",
-//        table = "ApplicationPermission")
-//@javax.jdo.annotations.Inheritance(
-//        strategy = InheritanceStrategy.NEW_TABLE)
-//@javax.jdo.annotations.DatastoreIdentity(
-//        strategy = IdGeneratorStrategy.NATIVE, column = "id")
-//@javax.jdo.annotations.Version(
-//        strategy = VersionStrategy.VERSION_NUMBER,
-//        column = "version")
-//@javax.jdo.annotations.Queries( {
-//    @javax.jdo.annotations.Query(
-//            name = "findByRole", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-//                    + "WHERE role == :role"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByUser", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-//                    + "WHERE (u.roles.contains(role) && u.username == :username) "
-//                    + "VARIABLES org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser u"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByFeature", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-//                    + "WHERE featureType == :featureType "
-//                    + "   && featureFqn == :featureFqn"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByRoleAndRuleAndFeature", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-//                    + "WHERE role == :role "
-//                    + "   && rule == :rule "
-//                    + "   && featureType == :featureType "
-//                    + "   && featureFqn == :featureFqn "),
-//    @javax.jdo.annotations.Query(
-//            name = "findByRoleAndRuleAndFeatureType", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-//                    + "WHERE role == :role "
-//                    + "   && rule == :rule "
-//                    + "   && featureType == :featureType "),
-//})
-//@javax.jdo.annotations.Uniques({
-//    @javax.jdo.annotations.Unique(
-//            name = "ApplicationPermission_role_feature_rule_UNQ", members = { "role", "featureType", "featureFqn", "rule" })
-//})
 @Entity
+@Table(
+        schema = "isisExtensionsSecman",
+        name = "ApplicationPermission", 
+        uniqueConstraints=
+            @UniqueConstraint(
+                    name = "ApplicationPermission_role_feature_rule_UNQ", 
+                    columnNames={"role", "featureType", "featureFqn", "rule"})
+)
+@NamedQueries({
+    @NamedQuery(
+            name = NamedQueryNames.PERMISSION_BY_ROLE, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission x "
+                  + "WHERE x.role = :role"),
+//TODO not sure how to convert these    
+//    @NamedQuery(
+//            name = NamedQueryNames.PERMISSION_BY_USER, 
+//            query = "SELECT x "
+//                  + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission x "
+//                  + "WHERE (u.roles.contains(role) AND u.username == :username) "
+//                  + "VARIABLES org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser u"),
+    @NamedQuery(
+            name = NamedQueryNames.PERMISSION_BY_FEATURE, 
+            query = "SELECT x "
+                    + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission x "
+                    + "WHERE x.featureType = :featureType "
+                    + "   AND x.featureFqn = :featureFqn"),
+    @NamedQuery(
+            name = NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE_FQN, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission x "
+                  + "WHERE x.role = :role "
+                  + "   AND x.rule = :rule "
+                  + "   AND x.featureType = :featureType "
+                  + "   AND x.featureFqn = :featureFqn "),
+    @NamedQuery(
+            name = NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission x "
+                  + "WHERE x.role = :role "
+                  + "   AND x.rule = :rule "
+                  + "   AND x.featureType = :featureType "),
+})
+@EntityListeners(JpaEntityInjectionPointResolver.class)
 @DomainObject(
         objectType = "isissecurity.ApplicationPermission"
         )
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
index 378d569..4a92601 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
@@ -49,6 +49,7 @@ import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole;
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser;
 
@@ -80,7 +81,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
     public List<ApplicationPermission> findByRole(@NonNull final ApplicationRole role) {
         return repository.allMatches(
-                Query.named(ApplicationPermission.class, "findByRole")
+                Query.named(ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE)
                     .withParameter("role", role));
     }
 
@@ -97,7 +98,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
     private List<ApplicationPermission> findByUser(final String username) {
         return repository.allMatches(
-                Query.named(ApplicationPermission.class, "findByUser")
+                Query.named(ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_USER)
                     .withParameter("username", username));
     }
 
@@ -161,7 +162,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationPermissionRule rule,
             final ApplicationFeatureType type) {
         return repository.allMatches(Query.named(
-                        ApplicationPermission.class, "findByRoleAndRuleAndFeatureType")
+                        ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE)
                     .withParameter("role", role)
                     .withParameter("rule", rule)
                     .withParameter("featureType", type))
@@ -191,7 +192,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
         return repository
                 .uniqueMatch(Query.named(
-                                ApplicationPermission.class, "findByRoleAndRuleAndFeature")
+                                ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE_FQN)
                         .withParameter("role", role)
                         .withParameter("rule", rule)
                         .withParameter("featureType", type)
@@ -211,7 +212,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Collection<ApplicationPermission> findByFeature(final ApplicationFeatureId featureId) {
         return repository.allMatches(
                 Query.named(
-                        ApplicationPermission.class, "findByFeature")
+                        ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_FEATURE)
                 .withParameter("featureType", featureId.getType())
                 .withParameter("featureFqn", featureId.getFullyQualifiedName()))
                 .stream()
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.java
index 6d78d30..bbaab08 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.java
@@ -26,9 +26,14 @@ import java.util.TreeSet;
 import javax.inject.Inject;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.ManyToMany;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Bounding;
@@ -48,38 +53,38 @@ import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermissionRepository;
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser;
+import org.apache.isis.persistence.jpa.applib.integration.JpaEntityInjectionPointResolver;
 
 import lombok.Getter;
 import lombok.Setter;
 
-//@javax.jdo.annotations.PersistenceCapable(
-//        identityType = IdentityType.DATASTORE,
-//        schema = "isisExtensionsSecman",
-//        table = "ApplicationRole")
-//@javax.jdo.annotations.Inheritance(
-//        strategy = InheritanceStrategy.NEW_TABLE)
-//@javax.jdo.annotations.DatastoreIdentity(
-//        strategy = IdGeneratorStrategy.NATIVE, column = "id")
-//@javax.jdo.annotations.Uniques({
-//    @javax.jdo.annotations.Unique(
-//            name = "ApplicationRole_name_UNQ", members = { "name" })
-//})
-//@javax.jdo.annotations.Queries({
-//    @javax.jdo.annotations.Query(
-//            name = "findByName", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole "
-//                    + "WHERE name == :name"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByNameContaining", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole "
-//                    + "WHERE name.matches(:nameRegex) ")
-//})
 @Entity
+@Table(
+        schema = "isisExtensionsSecman",
+        name = "ApplicationRole", 
+        uniqueConstraints =
+            @UniqueConstraint(
+                    name = "ApplicationRole_name_UNQ", 
+                    columnNames={"name"})
+)
+@NamedQueries({
+    @NamedQuery(
+            name = NamedQueryNames.ROLE_BY_NAME, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole x "
+                  + "WHERE x.name = :name"),
+//TODO not sure how to convert these
+//    @NamedQuery(
+//            name = NamedQueryNames.ROLE_BY_NAME_CONTAINING, 
+//            query = "SELECT x "
+//                  + "FROM org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole x "
+//                  + "WHERE x.name.matches(:nameRegex)"),
+})
+@EntityListeners(JpaEntityInjectionPointResolver.class)
 @DomainObject(
         bounding = Bounding.BOUNDED,
         //		bounded = true,
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRoleRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRoleRepository.java
index 624d212..35f3c5a 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRoleRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRoleRepository.java
@@ -35,6 +35,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser;
 import org.apache.isis.extensions.secman.model.dom.permission.ApplicationPermission_delete;
 
@@ -68,7 +69,7 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
         if(name == null) {
             return Optional.empty();
         }
-        return repository.uniqueMatch(Query.named(ApplicationRole.class, "findByName")
+        return repository.uniqueMatch(Query.named(ApplicationRole.class, NamedQueryNames.ROLE_BY_NAME)
                 .withParameter("name", name));
     }
 
@@ -78,7 +79,7 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
         if(search != null && search.length() > 0) {
             String nameRegex = String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."));
             return repository.allMatches(
-                    Query.named(ApplicationRole.class, "findByNameContaining")
+                    Query.named(ApplicationRole.class, NamedQueryNames.ROLE_BY_NAME_CONTAINING)
                     .withParameter("nameRegex", nameRegex))
                     .stream()
                     .collect(_Sets.toUnmodifiableSorted());
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.java
index f5c83c7..c99eb76 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.java
@@ -26,7 +26,11 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Collection;
@@ -42,42 +46,38 @@ import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 
 import lombok.Getter;
 import lombok.Setter;
 
-//@javax.jdo.annotations.PersistenceCapable(
-//        identityType = IdentityType.APPLICATION,
-//        schema = "isisExtensionsSecman",
-//        table = "ApplicationTenancy")
-//@javax.jdo.annotations.Inheritance(
-//        strategy = InheritanceStrategy.NEW_TABLE)
-//@javax.jdo.annotations.DatastoreIdentity(
-//        strategy = IdGeneratorStrategy.NATIVE, column = "id")
-//@javax.jdo.annotations.Version(
-//        strategy = VersionStrategy.VERSION_NUMBER,
-//        column = "version")
-//@javax.jdo.annotations.Uniques({
-//    @javax.jdo.annotations.Unique(
-//            name = "ApplicationTenancy_name_UNQ", members = { "name" })
-//})
-//@javax.jdo.annotations.Queries( {
-//    @javax.jdo.annotations.Query(
-//            name = "findByPath", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.tenancy.ApplicationTenancy "
-//                    + "WHERE path == :path"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByName", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.tenancy.ApplicationTenancy "
-//                    + "WHERE name == :name"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByNameOrPathMatching", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.tenancy.ApplicationTenancy "
-//                    + "WHERE name.matches(:regex) || path.matches(:regex) ")})
 @Entity
+@Table(
+        schema = "isisExtensionsSecman",
+        name = "ApplicationTenancy", 
+        uniqueConstraints =
+            @UniqueConstraint(
+                    name = "ApplicationTenancy_name_UNQ", 
+                    columnNames={"name"})
+)
+@NamedQueries({
+    @NamedQuery(
+            name = NamedQueryNames.TENANCY_BY_PATH, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.tenancy.ApplicationTenancy x "
+                  + "WHERE x.path = :path"),
+    @NamedQuery(
+            name = NamedQueryNames.TENANCY_BY_NAME, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.tenancy.ApplicationTenancy x "
+                  + "WHERE x.name = :name"),
+//TODO not sure how to convert these
+//    @NamedQuery(
+//            name = NamedQueryNames.TENANCY_BY_NAME_OR_PATH_MATCHING, 
+//            query = "SELECT x "
+//                  + "FROM org.apache.isis.extensions.secman.jpa.dom.tenancy.ApplicationTenancy x "
+//                  + "WHERE x.name.matches(:regex) || x.path.matches(:regex)"),
+})
 @DomainObject(
         objectType = "isissecurity.ApplicationTenancy",
         autoCompleteRepository = ApplicationTenancyRepository.class,
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancyRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancyRepository.java
index ba02450..6d6faa0 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancyRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancyRepository.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser;
 
 import lombok.NonNull;
@@ -68,7 +69,7 @@ implements org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancyRepos
         if (search == null) {
             return Collections.emptySortedSet();
         }
-        return repository.allMatches(Query.named(ApplicationTenancy.class, "findByNameOrPathMatching")
+        return repository.allMatches(Query.named(ApplicationTenancy.class, NamedQueryNames.TENANCY_BY_NAME_OR_PATH_MATCHING)
                 .withParameter("regex", String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."))))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -86,7 +87,7 @@ implements org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancyRepos
     }
 
     public ApplicationTenancy findByName(final String name) {
-        return repository.uniqueMatch(Query.named(ApplicationTenancy.class, "findByName")
+        return repository.uniqueMatch(Query.named(ApplicationTenancy.class, NamedQueryNames.TENANCY_BY_NAME)
                 .withParameter("name", name)).orElse(null);
     }
 
@@ -106,7 +107,7 @@ implements org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancyRepos
         if (path == null) {
             return null;
         }
-        return repository.uniqueMatch(Query.named(ApplicationTenancy.class, "findByPath")
+        return repository.uniqueMatch(Query.named(ApplicationTenancy.class, NamedQueryNames.TENANCY_BY_PATH)
                 .withParameter("path", path))
                 .orElse(null);
     }
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
index 0d21e93..f5319d2 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
@@ -26,11 +26,16 @@ import java.util.TreeSet;
 import javax.inject.Inject;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Collection;
@@ -57,64 +62,61 @@ import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionVal
 import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
 import org.apache.isis.extensions.secman.api.user.AccountType;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermissionRepository;
 import org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole;
+import org.apache.isis.persistence.jpa.applib.integration.JpaEntityInjectionPointResolver;
 
 import lombok.Getter;
 import lombok.Setter;
 import lombok.val;
 
-//@javax.jdo.annotations.PersistenceCapable(
-//        identityType = IdentityType.DATASTORE,
-//        schema = "isisExtensionsSecman",
-//        table = "ApplicationUser")
-//@javax.jdo.annotations.Inheritance(
-//        strategy = InheritanceStrategy.NEW_TABLE)
-//@javax.jdo.annotations.DatastoreIdentity(
-//        strategy = IdGeneratorStrategy.NATIVE, column = "id")
-//@javax.jdo.annotations.Version(
-//        strategy = VersionStrategy.VERSION_NUMBER,
-//        column = "version")
-//@javax.jdo.annotations.Uniques({
-//    @javax.jdo.annotations.Unique(
-//            name = "ApplicationUser_username_UNQ", members = { "username" })
-//})
-//@javax.jdo.annotations.Queries( {
-//    @javax.jdo.annotations.Query(
-//            name = "findByUsername", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser "
-//                    + "WHERE username == :username"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByEmailAddress", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser "
-//                    + "WHERE emailAddress == :emailAddress"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByAtPath", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser "
-//                    + "WHERE atPath == :atPath"),
-//    @javax.jdo.annotations.Query(
-//            name = "findByName", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser "
-//                    + "WHERE username.matches(:nameRegex)"
-//                    + "   || familyName.matches(:nameRegex)"
-//                    + "   || givenName.matches(:nameRegex)"
-//                    + "   || knownAs.matches(:nameRegex)"),
-//    @javax.jdo.annotations.Query(
-//            name = "find", language = "JDOQL",
-//            value = "SELECT "
-//                    + "FROM org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser "
-//                    + "WHERE username.matches(:regex)"
-//                    + " || familyName.matches(:regex)"
-//                    + " || givenName.matches(:regex)"
-//                    + " || knownAs.matches(:regex)"
-//                    + " || emailAddress.matches(:regex)")
-//})
 @Entity
+@Table(
+        schema = "isisExtensionsSecman",
+        name = "ApplicationUser", 
+        uniqueConstraints =
+            @UniqueConstraint(
+                    name = "ApplicationUser_username_UNQ", 
+                    columnNames={"username"})
+)
+@NamedQueries({
+    @NamedQuery(
+            name = NamedQueryNames.USER_BY_USERNAME, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser x "
+                  + "WHERE x.username = :username"),
+    @NamedQuery(
+            name = NamedQueryNames.USER_BY_EMAIL, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser x "
+                  + "WHERE x.emailAddress = :emailAddress"),
+    @NamedQuery(
+            name = NamedQueryNames.USER_BY_ATPATH, 
+            query = "SELECT x "
+                  + "FROM org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser x "
+                  + "WHERE x.atPath = :atPath"),
+//TODO not sure how to convert these    
+//    @NamedQuery(
+//            name = NamedQueryNames.USER_BY_NAME, 
+//            query = "SELECT x "
+//                  + "FROM org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser x "
+//                  + "WHERE x.username.matches(:nameRegex)"
+//                  + "   || x.familyName.matches(:nameRegex)"
+//                  + "   || x.givenName.matches(:nameRegex)"
+//                  + "   || x.knownAs.matches(:nameRegex)"),
+//    @NamedQuery(
+//            name = NamedQueryNames.USER_FIND, 
+//            query = "SELECT x "
+//                  + "FROM org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser x "
+//                  + "WHERE x.username.matches(:regex)"
+//                  + " || x.familyName.matches(:regex)"
+//                  + " || x.givenName.matches(:regex)"
+//                  + " || x.knownAs.matches(:regex)"
+//                  + " || x.emailAddress.matches(:regex)")
+})
+@EntityListeners(JpaEntityInjectionPointResolver.class)
 @DomainObject(
         objectType = "isissecurity.ApplicationUser",
         autoCompleteRepository = ApplicationUserRepository.class,
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserRepository.java
index 0d3f7d9..67a81f6 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserRepository.java
@@ -44,6 +44,7 @@ import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionServic
 import org.apache.isis.extensions.secman.api.events.UserCreatedEvent;
 import org.apache.isis.extensions.secman.api.user.AccountType;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
+import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole;
 import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_lock;
 import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_unlock;
@@ -98,7 +99,7 @@ implements org.apache.isis.extensions.secman.api.user.ApplicationUserRepository<
 
     @Override
     public Optional<ApplicationUser> findByUsername(final String username) {
-        return repository.uniqueMatch(Query.named(ApplicationUser.class, "findByUsername")
+        return repository.uniqueMatch(Query.named(ApplicationUser.class, NamedQueryNames.USER_BY_USERNAME)
                 .withParameter("username", username));
     }
 
@@ -110,7 +111,7 @@ implements org.apache.isis.extensions.secman.api.user.ApplicationUserRepository<
     }
 
     public Optional<ApplicationUser> findByEmailAddress(final String emailAddress) {
-        return repository.uniqueMatch(Query.named(ApplicationUser.class, "findByEmailAddress")
+        return repository.uniqueMatch(Query.named(ApplicationUser.class, NamedQueryNames.USER_BY_EMAIL)
                 .withParameter("emailAddress", emailAddress));
     }
 
@@ -119,7 +120,7 @@ implements org.apache.isis.extensions.secman.api.user.ApplicationUserRepository<
     @Override
     public Collection<ApplicationUser> find(final String search) {
         final String regex = String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."));
-        return repository.allMatches(Query.named(ApplicationUser.class, "find")
+        return repository.allMatches(Query.named(ApplicationUser.class, NamedQueryNames.USER_FIND)
                 .withParameter("regex", regex))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -129,7 +130,7 @@ implements org.apache.isis.extensions.secman.api.user.ApplicationUserRepository<
 
     @Override
     public Collection<ApplicationUser> findByAtPath(final String atPath) {
-        return repository.allMatches(Query.named(ApplicationUser.class, "findByAtPath")
+        return repository.allMatches(Query.named(ApplicationUser.class, NamedQueryNames.USER_BY_ATPATH)
                 .withParameter("atPath", atPath))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());