generator-jhipster 7.7.0 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +1 -2
  2. package/generators/app/index.js +10 -0
  3. package/generators/ci-cd/index.js +1 -1
  4. package/generators/ci-cd/templates/github-actions.yml.ejs +4 -4
  5. package/generators/client/files-common.js +1 -2
  6. package/generators/client/files-react.js +25 -2
  7. package/generators/client/index.js +1 -1
  8. package/generators/client/needle-api/needle-client-react.js +11 -8
  9. package/generators/client/templates/angular/angular.json.ejs +1 -9
  10. package/generators/client/templates/angular/jest.conf.js.ejs +1 -1
  11. package/generators/client/templates/angular/package.json +17 -18
  12. package/generators/client/templates/angular/package.json.ejs +1 -1
  13. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +1 -1
  14. package/generators/client/templates/angular/src/main/webapp/app/core/util/data-util.service.ts.ejs +1 -1
  15. package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
  16. package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +12 -1
  17. package/generators/client/templates/common/package.json +7 -6
  18. package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +2 -3
  19. package/generators/client/templates/react/.eslintrc.json.ejs +1 -1
  20. package/generators/client/templates/react/jest.conf.js.ejs +1 -1
  21. package/generators/client/templates/react/package.json +30 -31
  22. package/generators/client/templates/react/package.json.ejs +1 -0
  23. package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +1 -1
  24. package/generators/client/templates/react/src/main/webapp/app/config/store.ts.ejs +53 -6
  25. package/generators/client/templates/react/src/main/webapp/app/config/translation-middleware.ts.ejs +58 -0
  26. package/generators/client/templates/react/src/main/webapp/app/entities/menu.tsx.ejs +45 -0
  27. package/generators/client/templates/react/src/main/webapp/app/entities/reducers.ts.ejs +25 -0
  28. package/generators/client/templates/react/src/main/webapp/app/entities/routes.tsx.ejs +47 -0
  29. package/generators/client/templates/react/src/main/webapp/app/index.tsx.ejs +7 -7
  30. package/generators/client/templates/react/src/main/webapp/app/main.tsx.ejs +19 -0
  31. package/generators/client/templates/react/src/main/webapp/app/modules/administration/logs/logs.tsx.ejs +1 -1
  32. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +2 -1
  33. package/generators/client/templates/react/src/main/webapp/app/modules/login/login-modal.tsx.ejs +5 -1
  34. package/generators/client/templates/react/src/main/webapp/app/routes.tsx.ejs +24 -7
  35. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-loading.tsx.ejs +15 -0
  36. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +34 -6
  37. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/index.ts.ejs +9 -2
  38. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.spec.ts.ejs +9 -3
  39. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.ts.ejs +21 -5
  40. package/generators/client/templates/react/src/main/webapp/app/typings.d.ts.ejs +15 -0
  41. package/generators/client/templates/react/src/main/webapp/microfrontends/entities-menu.tsx.ejs +3 -0
  42. package/generators/client/templates/react/src/main/webapp/microfrontends/entities-routes.tsx.ejs +3 -0
  43. package/generators/client/templates/react/tsconfig.json.ejs +3 -3
  44. package/generators/client/templates/react/tsconfig.test.json.ejs +9 -1
  45. package/generators/client/templates/react/webpack/webpack.common.js.ejs +6 -13
  46. package/generators/client/templates/react/webpack/webpack.dev.js.ejs +7 -8
  47. package/generators/client/templates/react/webpack/webpack.microfrontend.js.jhi.react.ejs +99 -0
  48. package/generators/client/templates/react/webpack/webpack.prod.js.ejs +31 -21
  49. package/generators/client/templates/vue/package.json +16 -17
  50. package/generators/client/templates/vue/package.json.ejs +1 -1
  51. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +1 -0
  52. package/generators/client/templates/vue/src/main/webapp/app/shared/data/data-utils.service.ts.ejs +1 -1
  53. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +2 -2
  54. package/generators/client/templates/vue/tsconfig.json.ejs +0 -3
  55. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +6 -2
  56. package/generators/common/templates/package.json +2 -2
  57. package/generators/docker-compose/index.js +9 -5
  58. package/generators/entity/index.js +34 -19
  59. package/generators/entity-client/index.js +8 -0
  60. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +1 -1
  61. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +1 -1
  62. package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +1 -0
  63. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-delete-dialog.tsx.ejs +3 -3
  64. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-detail.tsx.ejs +5 -4
  65. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +19 -18
  66. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.reducer.ts.ejs +2 -2
  67. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +21 -20
  68. package/generators/entity-i18n/templates/i18n/entity_fr.json.ejs +1 -1
  69. package/generators/entity-server/files.js +30 -10
  70. package/generators/entity-server/index.js +19 -1
  71. package/generators/entity-server/templates/couchbase/src/main/java/package/domain/Entity.java.jhi.spring_data_couchbase.ejs +1 -1
  72. package/generators/entity-server/templates/couchbase/src/main/java/package/repository/EntityRepository.java.ejs +31 -8
  73. package/generators/entity-server/templates/partials/update_template.ejs +77 -0
  74. package/generators/entity-server/templates/reactive/partials/save_template.ejs +1 -1
  75. package/generators/entity-server/templates/reactive/partials/update_template.ejs +41 -0
  76. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +5 -5
  77. package/generators/entity-server/templates/src/main/java/package/common/get_template.ejs +1 -1
  78. package/generators/entity-server/templates/src/main/java/package/common/inject_template.ejs +13 -4
  79. package/generators/entity-server/templates/src/main/java/package/common/patch_template.ejs +2 -2
  80. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +2 -1
  81. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.javax_lifecycle_events.ejs +31 -0
  82. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_persistable.ejs +54 -0
  83. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_reactive.ejs +1 -1
  84. package/generators/entity-server/templates/src/main/java/package/domain/EntityCallback.java.ejs +43 -0
  85. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository.java.ejs +6 -6
  86. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +13 -16
  87. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryWithBagRelationshipsImpl.java.ejs +4 -3
  88. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +15 -23
  89. package/generators/entity-server/templates/src/main/java/package/repository/EntitySqlHelper_reactive.java.ejs +2 -2
  90. package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +2 -2
  91. package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +12 -25
  92. package/generators/entity-server/templates/src/main/java/package/service/EntityService.java.ejs +10 -2
  93. package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +21 -5
  94. package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +61 -90
  95. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +6 -4
  96. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +28 -15
  97. package/generators/generator-base-private.js +1 -1
  98. package/generators/generator-base.js +29 -0
  99. package/generators/generator-constants.js +5 -5
  100. package/generators/generator-transforms.js +0 -1
  101. package/generators/gradle/constants.cjs +1 -1
  102. package/generators/maven/files.cjs +0 -1
  103. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  104. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.properties +18 -2
  105. package/generators/maven/templates/mvnw +13 -7
  106. package/generators/maven/templates/mvnw.cmd +19 -13
  107. package/generators/maven/templates/pom.xml.jhi.ejs +1 -1
  108. package/generators/server/cleanup.js +19 -3
  109. package/generators/server/files.js +101 -17
  110. package/generators/server/index.js +11 -5
  111. package/generators/server/needle-api/needle-server-gradle.js +38 -0
  112. package/generators/server/templates/.mvn/jvm.config +1 -0
  113. package/generators/server/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  114. package/generators/server/templates/.mvn/wrapper/maven-wrapper.properties +18 -2
  115. package/generators/server/templates/build.gradle.ejs +7 -5
  116. package/generators/server/templates/couchbase/src/main/java/package/repository/JHipsterCouchbaseRepository.java.ejs +24 -1
  117. package/generators/server/templates/devcontainer/Dockerfile.ejs +25 -0
  118. package/generators/server/templates/devcontainer/devcontainer.json.ejs +64 -0
  119. package/generators/server/templates/gradle/wrapper/gradle-wrapper.jar +0 -0
  120. package/generators/server/templates/gradle.properties.ejs +4 -4
  121. package/generators/server/templates/mvnw +13 -7
  122. package/generators/server/templates/mvnw.cmd +19 -13
  123. package/generators/server/templates/pom.xml.ejs +19 -17
  124. package/generators/server/templates/settings.gradle.ejs +6 -4
  125. package/generators/server/templates/src/main/docker/app.yml.ejs +2 -6
  126. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +2 -1
  127. package/generators/server/templates/src/main/docker/mysql.yml.ejs +1 -0
  128. package/generators/server/templates/src/main/java/package/config/AsyncConfiguration.java.ejs +6 -0
  129. package/generators/{client/templates/react/src/main/webapp/app/entities/index.tsx.ejs → server/templates/src/main/java/package/config/KafkaSseConsumer.java.ejs} +8 -14
  130. package/generators/server/templates/src/main/java/package/config/KafkaSseProducer.java.ejs +30 -0
  131. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +12 -10
  132. package/generators/server/templates/src/main/java/package/repository/EntityManager.java.ejs +3 -3
  133. package/generators/server/templates/src/main/java/package/security/jwt/JWTFilter.java.ejs +1 -1
  134. package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +1 -1
  135. package/generators/server/templates/src/main/java/package/web/rest/KafkaResource.java.ejs +60 -108
  136. package/generators/server/templates/src/main/java/package/web/rest/KafkaResource_reactive.java.ejs +74 -0
  137. package/generators/server/templates/src/main/resources/config/application.yml.ejs +26 -22
  138. package/generators/server/templates/src/test/java/package/CassandraKeyspaceIT.java.ejs +3 -4
  139. package/generators/server/templates/src/test/java/package/IntegrationTest.java.ejs +9 -3
  140. package/generators/server/templates/src/test/java/package/TechnicalStructureTest.java.ejs +0 -3
  141. package/generators/server/templates/src/test/java/package/config/CassandraTestContainer.java.ejs +122 -0
  142. package/generators/server/templates/src/test/java/package/config/EmbeddedCassandra.java.ejs +11 -0
  143. package/generators/server/templates/src/test/java/package/config/EmbeddedKafka.java.ejs +11 -0
  144. package/generators/server/templates/src/test/java/package/config/EmbeddedMongo.java.ejs +11 -0
  145. package/generators/server/templates/src/test/java/package/config/KafkaTestContainer.java.ejs +38 -0
  146. package/generators/server/templates/src/test/java/package/config/MongoDbTestContainer.java.ejs +67 -0
  147. package/generators/server/templates/src/test/java/package/config/TestContainersSpringContextCustomizerFactory.java.ejs +114 -0
  148. package/generators/server/templates/src/test/java/package/cucumber/CucumberIT.java.ejs +3 -10
  149. package/generators/server/templates/src/test/java/package/security/DomainUserDetailsServiceIT.java.ejs +1 -4
  150. package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +5 -5
  151. package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +2 -4
  152. package/generators/server/templates/src/test/java/package/service/UserServiceIT.java.ejs +1 -4
  153. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +3 -3
  154. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT_oauth2.java.ejs +1 -4
  155. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT_skipUserManagement.java.ejs +1 -4
  156. package/generators/server/templates/src/test/java/package/web/rest/KafkaResourceIT.java.ejs +52 -123
  157. package/generators/server/templates/src/test/java/package/web/rest/KafkaResourceIT_reactive.java.ejs +99 -0
  158. package/generators/server/templates/src/test/java/package/web/rest/PublicUserResourceIT.java.ejs +7 -10
  159. package/generators/server/templates/src/test/java/package/web/rest/UserJWTControllerIT.java.ejs +1 -4
  160. package/generators/server/templates/src/test/java/package/web/rest/UserResourceIT.java.ejs +2 -5
  161. package/generators/server/templates/src/test/java/package/web/rest/errors/ExceptionTranslatorIT.java.ejs +1 -4
  162. package/generators/server/templates/src/test/java/package/web/rest/errors/ExceptionTranslatorIT_reactive.java.ejs +1 -4
  163. package/generators/server/templates/src/test/resources/META-INF/spring.factories.ejs +1 -1
  164. package/generators/server/templates/src/test/resources/config/application.yml.ejs +21 -20
  165. package/generators/server/templates/src/test/resources/testcontainers.properties.ejs +1 -0
  166. package/generators/workspaces/index.js +2 -1
  167. package/package.json +15 -15
  168. package/utils/entity.js +2 -0
  169. package/utils/field.js +8 -3
  170. package/utils/relationship.js +10 -1
  171. package/generators/entity-server/templates/src/main/java/package/repository/search/SortToSortBuilderListConverter.java.ejs +0 -25
  172. package/generators/maven/templates/.mvn/wrapper/MavenWrapperDownloader.java +0 -117
  173. package/generators/server/templates/.mvn/wrapper/MavenWrapperDownloader.java +0 -117
  174. package/generators/server/templates/src/main/java/package/config/KafkaProperties.java.ejs +0 -68
  175. package/generators/server/templates/src/test/java/package/AbstractCassandraTest.java.ejs +0 -125
  176. package/generators/server/templates/src/test/java/package/MongoDbTestContainerExtension.java.ejs +0 -37
  177. package/generators/server/templates/src/test/java/package/TestContainersSpringContextCustomizerFactory.java.ejs +0 -24
@@ -29,11 +29,6 @@ import org.springframework.data.domain.Page;
29
29
  import org.springframework.data.domain.PageImpl;
30
30
  <%_ } _%>
31
31
  import org.springframework.data.domain.Pageable;
32
- import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
33
- import org.elasticsearch.search.sort.SortBuilder;
34
- import java.util.List;
35
- import org.springframework.data.domain.PageRequest;
36
-
37
32
 
38
33
  <%_ } _%>
39
34
  <%_ if (reactive) { _%>
@@ -65,7 +60,7 @@ public interface <%= entityClass %>SearchRepository extends <% if (reactive) {%>
65
60
  <%_ if (reactive) { _%>
66
61
 
67
62
  interface <%= entityClass %>SearchRepositoryInternal {
68
- Flux<<%= entityClass %>> search(String query<% if (!paginationNo) { %>, Pageable pageable<% } %>);
63
+ Flux<<%= persistClass %>> search(String query<% if (!paginationNo) { %>, Pageable pageable<% } %>);
69
64
  }
70
65
 
71
66
  class <%= entityClass %>SearchRepositoryInternalImpl implements <%= entityClass %>SearchRepositoryInternal {
@@ -77,21 +72,13 @@ class <%= entityClass %>SearchRepositoryInternalImpl implements <%= entityClass
77
72
  }
78
73
 
79
74
  @Override
80
- public Flux<<%= entityClass %>> search(String query<% if (!paginationNo) { %>, Pageable pageable<% } %>) {
81
- <%_ if (!paginationNo) { _%>
82
- List<SortBuilder<?>> builders = new SortToSortBuilderListConverter().convert(pageable.getSort());
83
-
84
- NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withQuery(queryStringQuery(query))
85
- .withPageable(PageRequest.of(pageable.getPageNumber(), pageable.getPageSize()));
86
-
87
- queryBuilder.withSorts(builders);
88
-
89
- NativeSearchQuery nativeSearchQuery = queryBuilder.build();
90
- <%_ } else { _%>
75
+ public Flux<<%= persistClass %>> search(String query<% if (!paginationNo) { %>, Pageable pageable<% } %>) {
91
76
  NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryStringQuery(query));
92
- <%_ } _%>
77
+ <%_ if (!paginationNo) { _%>
78
+ nativeSearchQuery.setPageable(pageable);
79
+ <%_ }_%>
93
80
  return reactiveElasticsearchTemplate
94
- .search(nativeSearchQuery, <%= entityClass %>.class)
81
+ .search(nativeSearchQuery, <%= persistClass %>.class)
95
82
  .map(SearchHit::getContent);
96
83
  }
97
84
  }
@@ -99,9 +86,9 @@ class <%= entityClass %>SearchRepositoryInternalImpl implements <%= entityClass
99
86
 
100
87
  interface <%= entityClass %>SearchRepositoryInternal {
101
88
  <%_ if (paginationNo) { _%>
102
- Stream<<%= entityClass %>> search(String query);
89
+ Stream<<%= persistClass %>> search(String query);
103
90
  <%_ } else { _%>
104
- Page<<%= entityClass %>> search(String query, Pageable pageable);
91
+ Page<<%= persistClass %>> search(String query, Pageable pageable);
105
92
  <%_ } _%>
106
93
  }
107
94
 
@@ -115,19 +102,19 @@ class <%= entityClass %>SearchRepositoryInternalImpl implements <%= entityClass
115
102
 
116
103
  <%_ if (paginationNo) { _%>
117
104
  @Override
118
- public Stream<<%= entityClass %>> search(String query) {
105
+ public Stream<<%= persistClass %>> search(String query) {
119
106
  NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryStringQuery(query));
120
107
  return elasticsearchTemplate
121
- .search(nativeSearchQuery, <%= entityClass %>.class)
108
+ .search(nativeSearchQuery, <%= persistClass %>.class)
122
109
  .map(SearchHit::getContent)
123
110
  .stream();
124
111
  }
125
112
  <%_ } else { _%>
126
113
  @Override
127
- public Page<<%= entityClass %>> search(String query, Pageable pageable) {
114
+ public Page<<%= persistClass %>> search(String query, Pageable pageable) {
128
115
  NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryStringQuery(query));
129
116
  nativeSearchQuery.setPageable(pageable);
130
- List<<%= entityClass %>> hits = elasticsearchTemplate.search(nativeSearchQuery, <%= entityClass %>.class).map(SearchHit::getContent)
117
+ List<<%= persistClass %>> hits = elasticsearchTemplate.search(nativeSearchQuery, <%= persistClass %>.class).map(SearchHit::getContent)
131
118
  .stream()
132
119
  .collect(Collectors.toList());
133
120
 
@@ -30,7 +30,7 @@ import <%= entityAbsolutePackage %>.service.dto.<%= dtoClass %>;
30
30
  <%_ } else { _%>
31
31
  import <%= entityAbsolutePackage %>.domain.<%= persistClass %>;
32
32
  <%_ } _%>
33
- <%_ if (!paginationNo || relationshipsContainEagerLoad) { _%>
33
+ <%_ if (!paginationNo || implementsEagerLoadApis) { _%>
34
34
 
35
35
  <%_ if (!reactive) { _%>
36
36
  import org.springframework.data.domain.Page;
@@ -65,6 +65,14 @@ public interface <%= entityClass %>Service {
65
65
  */
66
66
  <% if (reactive) { %>Mono<<% } %><%= instanceType %><% if (reactive) { %>><% } %> save(<%= instanceType %> <%= instanceName %>);
67
67
 
68
+ /**
69
+ * Updates a <%= entityInstance %>.
70
+ *
71
+ * @param <%= instanceName %> the entity to update.
72
+ * @return the persisted entity.
73
+ */
74
+ <% if (reactive) { %>Mono<<% } %><%= instanceType %><% if (reactive) { %>><% } %> update(<%= instanceType %> <%= instanceName %>);
75
+
68
76
  /**
69
77
  * Partially updates a <%= entityInstance %>.
70
78
  *
@@ -90,7 +98,7 @@ public interface <%= entityClass %>Service {
90
98
  <%= listOrFlux %><<%= instanceType %>> findAllWhere<%= relationship.relationshipNameCapitalized %>IsNull();
91
99
  <%_ } } _%>
92
100
 
93
- <%_ if (relationshipsContainEagerLoad) { _%>
101
+ <%_ if (implementsEagerLoadApis) { _%>
94
102
  /**
95
103
  * Get all the <%= entityInstancePlural %> with eager load of many-to-many relationships.
96
104
  *
@@ -51,7 +51,7 @@ import <%= entityAbsolutePackage %>.service.mapper.<%= entityClass %>Mapper;
51
51
  import org.slf4j.Logger;
52
52
  import org.slf4j.LoggerFactory;
53
53
 
54
- <%_ if (!paginationNo || relationshipsContainEagerLoad) { _%>
54
+ <%_ if (!paginationNo || implementsEagerLoadApis) { _%>
55
55
  <%_ if (!reactive) { _%>
56
56
  import org.springframework.data.domain.Page;
57
57
  <%_ } _%>
@@ -112,7 +112,23 @@ public class <%= serviceClassName %><% if (serviceImpl) { %> implements <%= enti
112
112
  <%_ } _%>
113
113
  public <% if (reactive) { %>Mono<<% } %><%= instanceType %><% if (reactive) { %>><% } %> save(<%= instanceType %> <%= instanceName %>) {
114
114
  log.debug("Request to save <%= entityClass %> : {}", <%= instanceName %>);
115
- <%- include('/partials/save_template', {asEntity, asDto, viaService: false, returnDirectly: true, isUsingMapsId: isUsingMapsId, mapsIdAssoc: mapsIdAssoc, isController: false}); -%>
115
+ <%- include('/partials/save_template', {asEntity, asDto, viaService: false, returnDirectly: true, isUsingMapsId: isUsingMapsId, mapsIdAssoc: mapsIdAssoc, isController: false, isPersisted: false}); -%>
116
+ }
117
+
118
+ <%_ if (!serviceImpl) { _%>
119
+ /**
120
+ * Update a <%= entityInstance %>.
121
+ *
122
+ * @param <%= instanceName %> the entity to save.
123
+ * @return the persisted entity.
124
+ */
125
+ <%_ } _%>
126
+ <%_ if (serviceImpl) { _%>
127
+ @Override
128
+ <%_ } _%>
129
+ public <% if (reactive) { %>Mono<<% } %><%= instanceType %><% if (reactive) { %>><% } %> update(<%= instanceType %> <%= instanceName %>) {
130
+ log.debug("Request to save <%= entityClass %> : {}", <%= instanceName %>);
131
+ <%- include('/partials/update_template', {updatableEntity, viaService: false, returnDirectly: true, isUsingMapsId: isUsingMapsId, mapsIdAssoc: mapsIdAssoc, isController: false, isPersisted: requiresPersistableImplementation}); -%>
116
132
  }
117
133
 
118
134
  <%_ if (!serviceImpl) { _%>
@@ -150,7 +166,7 @@ public class <%= serviceClassName %><% if (serviceImpl) { %> implements <%= enti
150
166
  public <% if (paginationNo) { %><%= listOrFlux %><% } else { %><%= pageOrFlux %><% } %><<%= instanceType %>> findAll(<% if (!paginationNo) { %>Pageable pageable<% } %>) {
151
167
  log.debug("Request to get all <%= entityClassPlural %>");
152
168
  <%_ if (paginationNo) { _%>
153
- return <%= entityInstance %>Repository.<% if (relationshipsContainEagerLoad) { %>findAllWithEagerRelationships<% } else { %>findAll<% } %>()<% if (dtoMapstruct) { %><% if (!reactive) { %>.stream()<% } %>
169
+ return <%= entityInstance %>Repository.<% if (implementsEagerLoadApis) { %>findAllWithEagerRelationships<% } else { %>findAll<% } %>()<% if (dtoMapstruct) { %><% if (!reactive) { %>.stream()<% } %>
154
170
  .map(<%= entityToDtoReference %>)<% if (!reactive) { %>
155
171
  .collect(Collectors.toCollection(LinkedList::new))<% } } %>;
156
172
  <%_ } else { _%>
@@ -159,7 +175,7 @@ public class <%= serviceClassName %><% if (serviceImpl) { %> implements <%= enti
159
175
  <%_ } _%>
160
176
  }
161
177
 
162
- <%_ if (relationshipsContainEagerLoad) { _%>
178
+ <%_ if (implementsEagerLoadApis) { _%>
163
179
 
164
180
  <%_ if (!serviceImpl) { _%>
165
181
  /**
@@ -213,7 +229,7 @@ public class <%= serviceClassName %><% if (serviceImpl) { %> implements <%= enti
213
229
  @Transactional(readOnly = true)
214
230
  <%_ } _%>
215
231
  public <%= optionalOrMono %><<%= instanceType %>> findOne(<%= primaryKey.type %> id) {
216
- log.debug("Request to get <%= entityClass %> : {}", id);<%- include('../../common/get_template', {asEntity, asDto, viaService: false, returnDirectly:true, relationshipsContainEagerLoad}); -%>
232
+ log.debug("Request to get <%= entityClass %> : {}", id);<%- include('../../common/get_template', {asEntity, asDto, viaService: false, returnDirectly:true, implementsEagerLoadApis}); -%>
217
233
  }
218
234
 
219
235
  <%_ if (!serviceImpl) { _%>
@@ -19,30 +19,34 @@
19
19
  package <%= entityAbsolutePackage %>.service.mapper;
20
20
 
21
21
  <%_
22
- let existingMappings = [];
23
- let uuidMapMethod = dtoReferences.some(reference => reference.valueReference && reference.valueReference.field && reference.valueReference.field.fieldTypeUUID);
24
- let byteMapMethod = dtoReferences.some(reference => reference.valueReference && reference.valueReference.field && reference.valueReference.field.fieldTypeBytes);
25
- for (reference of dtoReferences) {
26
- // if the entity is mapped twice, we should implement the mapping once
27
- if (reference.relationship && !reference.relationship.otherEntity.embedded && !existingMappings.includes(reference.name) && asEntity(reference.relationship.otherEntityNameCapitalized) !== persistClass) {
28
- existingMappings.push(reference.relationship.otherEntity.entityNameCapitalized);
29
- }
30
- }
22
+ const uuidMapMethod = dtoReferences.some(reference => reference.valueReference && reference.valueReference.field && reference.valueReference.field.fieldTypeUUID);
23
+ const byteMapMethod = dtoReferences.some(reference => reference.valueReference && reference.valueReference.field && reference.valueReference.field.fieldTypeBytes);
24
+ const dtoRelationships = dtoReferences.filter(reference => reference.relationship && !reference.relationship.otherEntity.embedded).map(reference => reference.relationship);
25
+ let otherEntitiesFields = otherEntities
26
+ .filter(otherEntity => dtoRelationships.some(relationship => relationship.otherEntity === otherEntity))
27
+ .map(otherEntity =>
28
+ dtoRelationships
29
+ .filter(relationship => relationship.otherEntity == otherEntity)
30
+ .map(({relatedField, collection}) => ({otherEntity, relatedField, collection}))
31
+ )
32
+ .flat();
33
+ otherEntitiesFields.forEach(a => {
34
+ a.collection = a.collection || otherEntitiesFields.some(b => a.otherEntity === b.otherEntity && a.relatedField === b.relatedField && b.collection == true)
35
+ });
36
+ otherEntitiesFields = _.uniqWith(otherEntitiesFields, (a, b) => a.otherEntity === b.otherEntity && a.collection === b.collection && a.relatedField === b.relatedField);
31
37
  _%>
32
38
 
33
- <%_ if (dtoReferences.some(r => r.relationship &&
34
- r.relationship.otherRelationship &&
35
- r.relationship.otherRelationship.reference.collection &&
36
- r.relationship.relationshipManyToMany
37
- ) || otherDtoReferences.some(r => r.collection)) { _%>
39
+ <%_ if (dtoRelationships.some(r => r.collection)) { _%>
38
40
  import java.util.Set;
41
+ import java.util.stream.Collectors;
39
42
  <%_ } _%>
40
43
 
41
44
  import <%= entityAbsoluteClass %>;
42
45
  import <%= entityAbsolutePackage %>.service.dto.<%= dtoClass %>;
43
46
 
44
- <%_ for (const otherEntity of _.uniq(dtoReferences.filter(ref => ref.relationship).map(ref => ref.relationship.otherEntity).filter(otherEntity => otherEntity.entityPackage !== entityPackage))) { _%>
45
- import <%= `${otherEntity.entityAbsolutePackage}.service.mapper.${otherEntity.entityClass}Mapper` %>;
47
+ <%_ for (const otherEntity of _.uniq(dtoRelationships.map(relationship => relationship.otherEntity).filter(otherEntity => otherEntity !== entity))) { _%>
48
+ import <%= otherEntity.entityAbsoluteClass %>;
49
+ import <%= otherEntity.entityAbsolutePackage %>.service.dto.<%= otherEntity.dtoClass %>;
46
50
  <%_ } _%>
47
51
 
48
52
  import org.mapstruct.*;
@@ -55,100 +59,67 @@ import java.util.UUID;
55
59
  /**
56
60
  * Mapper for the entity {@link <%= persistClass %>} and its DTO {@link <%= dtoClass %>}.
57
61
  */
58
- @Mapper(componentModel = "spring", uses = {<%= [...new Set(existingMappings.map(otherEntityNameCapitalized => otherEntityNameCapitalized + 'Mapper.class'))].join(', ') %>})
62
+ @Mapper(componentModel = "spring")
59
63
  public interface <%= entityClass %>Mapper extends EntityMapper<<%= dtoClass %>, <%= persistClass %>> {
60
- <%_ /***** Basic dto mapping *****/
61
- if (!embedded) {
62
- var renMapAnotEnt = false; //Render Mapping Annotation during Entity to DTO conversion?
63
- for (reference of dtoReferences.filter(reference => reference.relationship && !reference.relationship.otherEntity.embedded)) {
64
+ <%_ if (!embedded) { _%>
65
+ <%_ var renMapAnotEnt = false; //Render Mapping Annotation during Entity to DTO conversion? _%>
66
+ <%_ for (relationship of dtoRelationships) { _%>
67
+ <%_
64
68
  renMapAnotEnt = true;
65
- let qualifiedByName = reference.relationship.otherEntityField;
66
- qualifiedByName = qualifiedByName + (reference.collection ? 'Set' : ''); _%>
67
- @Mapping(target = "<%= reference.name %>", source = "<%= reference.name %>", qualifiedByName="<%= qualifiedByName %>")
68
- <%_ } _%>
69
- <%_ for (reference of dtoReferences.filter(reference => reference.field && reference.field.mapstructExpression)) {
69
+ let qualifiedByName = relationship.otherEntity.entityInstance + _.upperFirst(relationship.otherEntityField);
70
+ qualifiedByName = qualifiedByName + (relationship.collection ? 'Set' : '');
71
+ _%>
72
+ @Mapping(target = "<%= relationship.propertyName %>", source = "<%= relationship.propertyName %>", qualifiedByName="<%= qualifiedByName %>")
73
+ <%_ } _%>
74
+ <%_ for (const field of fields.filter(field => field.mapstructExpression)) {
70
75
  renMapAnotEnt = true; _%>
71
- @Mapping( target = "<%= reference.name %>", expression = "<%- reference.field.mapstructExpression %>")
72
- <%_ } _%>
73
- <%_ if (renMapAnotEnt) { _%>
76
+ @Mapping( target = "<%= field.propertyName %>", expression = "<%- field.mapstructExpression %>")
77
+ <%_ } _%>
78
+ <%_ if (renMapAnotEnt) { _%>
74
79
  <%= dtoClass %> toDto(<%= persistClass %> s);
75
- <%_ } %>
76
- <%_ } %>
77
- <%_ /***** Id mapping *****/
78
- const otherIdReferences = otherDtoReferences.filter(r => !r.relatedReference || r.relatedReference.id);
79
- if (!embedded && otherIdReferences.length > 0) {
80
- if (otherIdReferences.some(r => !r.collection)) { _%>
81
-
82
- @Named("<%= primaryKey.name %>")
83
- @BeanMapping(ignoreByDefault = true)
84
- <%_ let renMapAnotEnt = false; //Render Mapping Annotation during Entity to DTO conversion?
85
- for (reference of dtoReferences.filter(reference => reference.id)) {
86
- renMapAnotEnt = true; _%>
87
- @Mapping(target = "<%= reference.name %>", source = "<%= reference.name %>")
88
- <%_ } _%>
89
- <%_ if (renMapAnotEnt) { _%>
90
- <%= dtoClass %> toDtoId(<%= persistClass %> <%= persistInstance %>);
91
- <%_ } _%>
92
80
  <%_ } _%>
93
- <%_ if (otherIdReferences.some(r => r.collection)) { _%>
94
81
 
95
- @Named("<%= primaryKey.name %>Set")
96
- @BeanMapping(ignoreByDefault = true)
97
- <%_ let renMapAnotEnt = false; //Render Mapping Annotation during Entity to DTO conversion?
98
- for (reference of dtoReferences.filter(reference => reference.id)) {
99
- renMapAnotEnt = true; _%>
100
- @Mapping(target = "<%= reference.name %>", source = "<%= reference.name %>")
101
- <%_ } _%>
102
- <%_ if (renMapAnotEnt === true) { _%>
103
- Set<<%= dtoClass %>> toDtoIdSet(Set<<%= persistClass %>> <%= persistInstance %>);
82
+ <%_ var renMapAnotDto = false; //Render Mapping Annotation during DTO to Entity conversion? _%>
83
+ <%_ if(primaryKey.ids.length > 1) { _%>
84
+ <%_ renMapAnotDto = true; _%>
85
+ <%_ for (const id of primaryKey.ids) { _%>
86
+ @Mapping(target = "id.<%= id.name %>", source = "<%= id.nameDotted %>")
104
87
  <%_ } _%>
105
88
  <%_ } _%>
106
- <%_ } _%>
107
- <%_ if (!embedded) {
108
- // DTO -> entity mapping
109
- var renMapAnotDto = false; //Render Mapping Annotation during DTO to Entity conversion?
110
- if(primaryKey.ids.length > 1) {
111
- renMapAnotDto = true;
112
- primaryKey.ids.forEach(id => { _%>
113
-
114
- @Mapping(target = "id.<%= id.name %>", source = "<%= id.nameDotted %>")
115
- <%_ })
116
- }
117
- for (reference of dtoReferences.filter(reference => reference.relationship)) {
118
- if (reference.owned === false) {
119
- renMapAnotDto = true; _%>
120
- @Mapping(target = "<%= reference.name %>", ignore = true)
89
+ <%_ for (relationship of dtoRelationships) { _%>
90
+ <%_ if (!relationship.ownerSide) { _%>
91
+ <%_ renMapAnotDto = true; _%>
92
+ @Mapping(target = "<%= relationship.propertyName %>", ignore = true)
121
93
  <%_ }
122
- if (reference.collection && fluentMethods) {
94
+ if (relationship.collection && fluentMethods) {
123
95
  renMapAnotDto = true; _%>
124
- @Mapping(target = "remove<%= reference.relationship.relationshipNameCapitalized %>", ignore = true)
96
+ @Mapping(target = "remove<%= relationship.relationshipNameCapitalized %>", ignore = true)
125
97
  <%_ } _%>
126
98
  <%_ } _%>
127
99
  <%_ if (renMapAnotDto) { _%>
128
100
  <%= persistClass %> toEntity(<%= dtoClass %> <%= dtoInstance %>);
129
101
  <%_ } _%>
130
- <%_ /***** Add filtered backreference *****/
131
- const addedMappers = [];
132
- for (const otherReference of otherDtoReferences.filter(r => r.relatedReference && !r.relatedReference.id)) {
133
- const reference = otherReference.relationship.otherRelationship && otherReference.relationship.otherRelationship.reference;
134
- const collection = otherReference.collection;
135
- const mapperName = otherReference.relationship.otherEntityField + (collection ? 'Set' : '');
136
- if (addedMappers.includes(mapperName)) continue;
137
- addedMappers.push(mapperName);
138
- const backReferenceDtoClass = collection ? `Set<${dtoClass}>` : dtoClass;
139
- const backReferenceEntityClass = collection ? `Set<${persistClass}>` : persistClass; _%>
102
+ <%_ for (const {otherEntity, relatedField, collection} of otherEntitiesFields) { _%>
103
+ <%_ const mapperName = otherEntity.entityInstance + _.upperFirst(relatedField.propertyName); _%>
140
104
 
141
105
  @Named("<%= mapperName %>")
142
106
  @BeanMapping(ignoreByDefault = true)
143
- <%_ dtoReferences.filter(r => r.id && r !== reference).forEach(r => { _%>
144
- @Mapping(target = "<%= r.name %>", source = "<%= r.name %>")
145
- <%_ }); _%>
146
- <%_ if (otherReference.relationship.relatedField && !otherReference.relationship.relatedField.id) { _%>
147
- @Mapping(target = "<%= otherReference.relationship.relatedField.reference.name %>", source = "<%= otherReference.relationship.relatedField.reference.name %>")
107
+ <%_ for (const field of otherEntity.primaryKey.fields) { _%>
108
+ @Mapping(target = "<%= field.propertyName %>", source = "<%= field.propertyName %>")
148
109
  <%_ } _%>
149
- <%- backReferenceDtoClass %> toDto<%= _.upperFirst(mapperName) %>(<%- backReferenceEntityClass %> <%= persistInstance %>);
150
- <%_ } _%>
110
+ <%_ if (!relatedField.id) { _%>
111
+ @Mapping(target = "<%= relatedField.propertyName %>", source = "<%= relatedField.propertyName %>")
112
+ <%_ } _%>
113
+ <%- otherEntity.dtoClass %> toDto<%= _.upperFirst(mapperName) %>(<%- otherEntity.persistClass %> <%= otherEntity.persistInstance %>);
114
+ <%_ if (collection) { %>
115
+ <%_ const collectionMapperName = otherEntity.entityInstance + _.upperFirst(relatedField.propertyName) + 'Set'; _%>
151
116
 
117
+ @Named("<%= collectionMapperName %>")
118
+ default Set<<%- otherEntity.dtoClass %>> toDto<%= _.upperFirst(mapperName) %>Set(Set<<%- otherEntity.persistClass %>> <%= otherEntity.persistInstance %>) {
119
+ return <%= otherEntity.persistInstance %>.stream().map(this:: toDto<%= _.upperFirst(mapperName) %>).collect(Collectors.toSet());
120
+ }
121
+ <%_ } _%>
122
+ <%_ } _%>
152
123
  <%_ if (uuidMapMethod) { _%>
153
124
 
154
125
  default String map(UUID value) {
@@ -183,8 +183,10 @@ public class <%= entityClass %>Resource {
183
183
  <%_ } _%>
184
184
  <% } %>
185
185
  <%_ } _%>
186
- <%_ for (field of primaryKey.fields.filter(f => f.autoGenerateByService)) { _%>
186
+ <%_ if (!isUsingMapsId) { _%>
187
+ <%_ for (field of primaryKey.fields.filter(f => f.autoGenerateByService)) { _%>
187
188
  <%= instanceName %>.set<%= field.fieldNameCapitalized %>(UUID.randomUUID());
189
+ <%_ } _%>
188
190
  <%_ } _%>
189
191
  <%- include('/partials/save_template', {asEntity, asDto, viaService: viaService, returnDirectly: false, isUsingMapsId: isUsingMapsId, mapsIdAssoc: mapsIdAssoc, isController: true}); -%>
190
192
  <%_ if (reactive) { _%>
@@ -253,7 +255,7 @@ public class <%= entityClass %>Resource {
253
255
  <%_ } _%>
254
256
  <% } %>
255
257
  <%_ } _%>
256
- <%- include('/partials/save_template', {asEntity, asDto, viaService: viaService, returnDirectly: false, isUsingMapsId: false, mapsIdAssoc: mapsIdAssoc}); -%>
258
+ <%- include('/partials/update_template', {updatableEntity, viaService: viaService, returnDirectly: false, isUsingMapsId: false, mapsIdAssoc: mapsIdAssoc, isController: true, isPersisted: requiresPersistableImplementation}); -%>
257
259
  <%_ if (reactive) { _%>
258
260
  .switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.NOT_FOUND)))
259
261
  .map(result -> ResponseEntity.ok()
@@ -346,7 +348,7 @@ public class <%= entityClass %>Resource {
346
348
  * @param request a {@link ServerHttpRequest} request.
347
349
  <%_ } _%>
348
350
  <%_ } _%>
349
- <%_ if (!jpaMetamodelFiltering && relationshipsContainEagerLoad) { _%>
351
+ <%_ if (!jpaMetamodelFiltering && implementsEagerLoadApis) { _%>
350
352
  * @param eagerload flag to eager load entities from relationships (This is applicable for many-to-many).
351
353
  <%_ } _%>
352
354
  <%_ if (jpaMetamodelFiltering) { _%>
@@ -392,7 +394,7 @@ public class <%= entityClass %>Resource {
392
394
  @Transactional(readOnly = true)
393
395
  <%_ } _%>
394
396
  public <% if (reactive) { %>Mono<<% } %>ResponseEntity<<%= instanceType %>><% if (reactive) { %>><% } %> get<%= entityClass %>(@PathVariable <%= primaryKey.type %> id) {
395
- log.debug("REST request to get <%= entityClass %> : {}", id);<%- include('../../common/get_template', {asEntity, asDto, viaService, returnDirectly:false, relationshipsContainEagerLoad}); -%>
397
+ log.debug("REST request to get <%= entityClass %> : {}", id);<%- include('../../common/get_template', {asEntity, asDto, viaService, returnDirectly:false, implementsEagerLoadApis}); -%>
396
398
  return ResponseUtil.wrapOrNotFound(<%= instanceName %>);
397
399
  }
398
400
  <%_ if (!readOnly) { _%>
@@ -60,9 +60,6 @@ _%>
60
60
  <%_ if (entityAbsolutePackage !== packageName) { _%>
61
61
  import <%= packageName %>.web.rest.TestUtil;
62
62
  <% } %>
63
- <%_ if (databaseTypeCassandra) { _%>
64
- import <%= packageName %>.AbstractCassandraTest;
65
- <%_ } _%>
66
63
  import <%= packageName %>.IntegrationTest;
67
64
  import <%= entityAbsolutePackage %>.domain.<%= persistClass %>;
68
65
  <%_
@@ -92,7 +89,7 @@ import <%= entityAbsolutePackage %>.repository.<%= mapsIdAssoc.otherEntityNameCa
92
89
  <%_ if (searchEngineElasticsearch) { _%>
93
90
  import <%= entityAbsolutePackage %>.repository.search.<%= entityClass %>SearchRepository;
94
91
  <%_ } _%>
95
- <%_ if (!serviceNo && fieldsContainOwnerManyToMany) { _%>
92
+ <%_ if (!serviceNo && implementsEagerLoadApis) { _%>
96
93
  import <%= entityAbsolutePackage %>.service.<%= entityClass %>Service;
97
94
  <%_ } _%>
98
95
  <%_ if (dtoMapstruct) { _%>
@@ -108,7 +105,7 @@ import org.junit.jupiter.api.AfterEach;
108
105
  <%_ } _%>
109
106
  import org.junit.jupiter.api.BeforeEach;
110
107
  import org.junit.jupiter.api.Test;
111
- <%_ if (searchEngineElasticsearch || fieldsContainOwnerManyToMany || cacheProviderRedis || databaseTypeNeo4j || reactiveSqlTestContainers) { _%>
108
+ <%_ if (searchEngineElasticsearch || implementsEagerLoadApis || cacheProviderRedis || databaseTypeNeo4j || reactiveSqlTestContainers) { _%>
112
109
  import org.mockito.Mock;
113
110
  import org.junit.jupiter.api.extension.ExtendWith;
114
111
  import org.mockito.junit.jupiter.MockitoExtension;
@@ -119,7 +116,7 @@ import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWeb
119
116
  <%_ } else { _%>
120
117
  import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
121
118
  <%_ } _%>
122
- <%_ if (searchEngineElasticsearch && !paginationNo || fieldsContainOwnerManyToMany) { _%>
119
+ <%_ if (searchEngineElasticsearch && !paginationNo || implementsEagerLoadApis) { _%>
123
120
  import org.springframework.data.domain.PageImpl;
124
121
  import org.springframework.data.domain.PageRequest;
125
122
  <%_ } _%>
@@ -141,7 +138,7 @@ import org.springframework.transaction.annotation.Transactional;
141
138
  <%_ if (fieldsContainBlob) { _%>
142
139
  import org.springframework.util.Base64Utils;
143
140
  <%_ } _%>
144
- <%_ if (reactive && (fieldsContainOwnerManyToMany || searchEngineElasticsearch)) { _%>
141
+ <%_ if (reactive && (implementsEagerLoadApis || searchEngineElasticsearch)) { _%>
145
142
  import reactor.core.publisher.Flux;
146
143
  import reactor.core.publisher.Mono;
147
144
  <%_ } _%>
@@ -173,7 +170,7 @@ import java.time.ZoneId;
173
170
  <%_ if (fieldsContainInstant) { _%>
174
171
  import java.time.temporal.ChronoUnit;
175
172
  <%_ } _%>
176
- <%_ if (fieldsContainOwnerManyToMany) { _%>
173
+ <%_ if (!reactive && implementsEagerLoadApis) { _%>
177
174
  import java.util.ArrayList;
178
175
  <%_ } _%>
179
176
  <%_ if (searchEngineElasticsearch && !reactive) { _%>
@@ -209,7 +206,7 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
209
206
  import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
210
207
  <%_ } _%>
211
208
  <%_ } _%>
212
- <%_ if (searchEngineElasticsearch || fieldsContainOwnerManyToMany) { _%>
209
+ <%_ if (searchEngineElasticsearch || implementsEagerLoadApis) { _%>
213
210
  import static org.mockito.Mockito.*;
214
211
  <%_ } _%>
215
212
  <%_ if (!reactive) { _%>
@@ -226,7 +223,7 @@ import <%= entityAbsolutePackage %>.domain.enumeration.<%= field.fieldType %>;
226
223
  * Integration tests for the {@link <%= entityClass %>Resource} REST controller.
227
224
  */
228
225
  @IntegrationTest
229
- <%_ if (cacheProviderRedis || searchEngineElasticsearch || fieldsContainOwnerManyToMany) { _%>
226
+ <%_ if (cacheProviderRedis || searchEngineElasticsearch || implementsEagerLoadApis) { _%>
230
227
  @ExtendWith(MockitoExtension.class)
231
228
  <%_ } _%>
232
229
  <%_ if (reactive) { _%>
@@ -235,7 +232,7 @@ import <%= entityAbsolutePackage %>.domain.enumeration.<%= field.fieldType %>;
235
232
  @AutoConfigureMockMvc
236
233
  <%_ } _%>
237
234
  @WithMockUser
238
- class <%= entityClass %>ResourceIT <% if (databaseTypeCassandra) { %>extends AbstractCassandraTest <% } %>{
235
+ class <%= entityClass %>ResourceIT {
239
236
  <%_
240
237
  for (field of fields.filter(field => !field.id && !field.transient)) {
241
238
  const defaultValueName = 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase();
@@ -432,7 +429,7 @@ if (field.fieldTypeString || field.blobContentTypeText) {
432
429
  @Autowired
433
430
  private UserRepository userRepository;
434
431
  <%_ } _%>
435
- <%_ if (fieldsContainOwnerManyToMany) { _%>
432
+ <%_ if (implementsEagerLoadApis) { _%>
436
433
 
437
434
  @Mock
438
435
  private <%= entityClass %>Repository <%= entityInstance %>RepositoryMock;
@@ -442,7 +439,7 @@ if (field.fieldTypeString || field.blobContentTypeText) {
442
439
  @Autowired
443
440
  private <%= entityClass %>Mapper <%= entityInstance %>Mapper;
444
441
  <%_ } if (!serviceNo) { _%>
445
- <%_ if (fieldsContainOwnerManyToMany) { _%>
442
+ <%_ if (implementsEagerLoadApis) { _%>
446
443
 
447
444
  @Mock
448
445
  private <%= entityClass %>Service <%= entityInstance %>ServiceMock;
@@ -481,11 +478,16 @@ if (field.fieldTypeString || field.blobContentTypeText) {
481
478
  */
482
479
  public static <%= persistClass %> create<% if (fieldStatus === 'UPDATED_') { _%>Updated<%_ } %>Entity(<% if (databaseTypeSql) { %>EntityManager em<% } %>) {
483
480
  <%_ if (fluentMethods) { _%>
484
- <%= persistClass %> <%= persistInstance %> = new <%= persistClass %>()<% for (field of fields.filter(field => !field.id && !field.transient)) { %>
481
+ <%= persistClass %> <%= persistInstance %> = new <%= persistClass %>()<%_ if (reactive && databaseTypeSql && primaryKey.typeUUID && !isUsingMapsId) { _%>
482
+ .<%= primaryKey.name %>(UUID.randomUUID())
483
+ <%_ } _%><% for (field of fields.filter(field => !field.id && !field.transient)) { %>
485
484
  .<%= field.fieldName %>(<%= fieldStatus + field.fieldNameUnderscored.toUpperCase() %>)<% if (field.fieldTypeBinary && !field.blobContentTypeText) { %>
486
485
  .<%= field.fieldName %>ContentType(<%= fieldStatus + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE)<% } %><% } %>;
487
486
  <%_ } else { _%>
488
487
  <%= persistClass %> <%= persistInstance %> = new <%= persistClass %>();
488
+ <%_ if (reactive && databaseTypeSql && primaryKey.typeUUID && !isUsingMapsId) { _%>
489
+ <%= persistInstance %>.set<%= primaryKey.fields[0].fieldInJavaBeanMethod %>(UUID.randomUUID());
490
+ <%_ } _%>
489
491
  <%_ for (field of fields.filter(field => !field.id && !field.transient)) { _%>
490
492
  <%= persistInstance %>.set<%= field.fieldInJavaBeanMethod %>(<%= fieldStatus + field.fieldNameUnderscored.toUpperCase() %>);
491
493
  <%_ if (field.fieldTypeBinary && !field.blobContentTypeText) { _%>
@@ -517,13 +519,17 @@ if (field.fieldTypeString || field.blobContentTypeText) {
517
519
  <%_ } else { _%>
518
520
  <%= asEntity(otherEntityNameCapitalized) %> <%= otherEntityName %>;
519
521
  <%_ if (databaseTypeSql && !reactive) { _%>
522
+ <%_ if (!isUsingMapsId || fieldStatus !== "UPDATED_") { _%>
520
523
  if (TestUtil.findAll(em, <%= asEntity(otherEntityNameCapitalized) %>.class).isEmpty()) {
524
+ <%_ } _%>
521
525
  <%= otherEntityName %> = <%= createEntityPrefix %><%= otherEntityNameCapitalized %>ResourceIT.create<% if (fieldStatus === 'UPDATED_') { %>Updated<% } %>Entity(em)<%= createEntityPostfix %>;
522
526
  em.persist(<%= otherEntityName %>);
523
527
  em.flush();
528
+ <%_ if (!isUsingMapsId || fieldStatus !== "UPDATED_") { _%>
524
529
  } else {
525
530
  <%= otherEntityName %> = TestUtil.findAll(em, <%= asEntity(otherEntityNameCapitalized) %>.class).get(0);
526
531
  }
532
+ <%_ } _%>
527
533
  <%_ } else { _%>
528
534
  <%= otherEntityName %> = <%= createEntityPrefix %><%= otherEntityNameCapitalized %>ResourceIT.create<% if (fieldStatus === 'UPDATED_') { %>Updated<% } %>Entity(<% if (databaseType === 'sql') { %>em<% } %>)<%= createEntityPostfix %>;
529
535
  <%_ } _%>
@@ -597,6 +603,13 @@ _%>
597
603
  // Configure the mock search repository
598
604
  when(mock<%= entityClass %>SearchRepository.save(any()))
599
605
  .thenAnswer(invocation -> Mono.just(invocation.getArgument(0)));
606
+ <%_ } _%>
607
+ <%_
608
+ // overwrite the id field again with null
609
+ // the create method here is supposed to be used for other tests as well,
610
+ // which may expect an id to be set (at least in the reactive stack)
611
+ if (reactive && databaseTypeSql && primaryKey.typeUUID && !isUsingMapsId) { _%>
612
+ <%= persistInstance %>.set<%= primaryKey.nameCapitalized %>(null);
600
613
  <%_ } _%>
601
614
  // Create the <%= entityClass %>
602
615
  <%_ if (dtoMapstruct) { _%>
@@ -887,7 +900,7 @@ _%>
887
900
  if (field.fieldTypeZonedDateTime) { %>)<% } else
888
901
  if (!field.fieldTypeString) { %>.toString()<% } %>))<%= !reactive ? ')' : '' %><%_ } _%>;
889
902
  }
890
- <% if (fieldsContainOwnerManyToMany && !databaseTypeNeo4j && !databaseTypeCouchbase) { %>
903
+ <% if (implementsEagerLoadApis && !databaseTypeNeo4j && !databaseTypeCouchbase) { %>
891
904
  @SuppressWarnings({"unchecked"})
892
905
  void getAll<%= entityClassPlural %>WithEagerRelationshipsIsEnabled() <% if (!reactive) { %>throws Exception <% } %>{
893
906
  <%_ if (!serviceNo) { _%>
@@ -808,7 +808,7 @@ module.exports = class JHipsterBasePrivateGenerator extends Generator {
808
808
  } else {
809
809
  const javaVersion = stderr.match(/(?:java|openjdk) version "(.*)"/)[1];
810
810
  if (!javaVersion.match(new RegExp(`(${JAVA_COMPATIBLE_VERSIONS.map(ver => `^${ver}`).join('|')})`))) {
811
- const [latest, ...others] = JAVA_COMPATIBLE_VERSIONS.reverse();
811
+ const [latest, ...others] = JAVA_COMPATIBLE_VERSIONS.concat().reverse();
812
812
  this.warning(
813
813
  `Java ${others.reverse().join(', ')} or ${latest} are not found on your computer. Your Java version is: ${chalk.yellow(
814
814
  javaVersion
@@ -1136,6 +1136,16 @@ module.exports = class JHipsterBaseGenerator extends PrivateBase {
1136
1136
  this.needleApi.serverGradle.addPlugin(group, name, version);
1137
1137
  }
1138
1138
 
1139
+ /**
1140
+ * A new Gradle plugin to plugin management block in settings.gradle
1141
+ *
1142
+ * @param {string} id - plugin id
1143
+ * @param {string} version - explicit plugin version number
1144
+ */
1145
+ addGradlePluginToPluginManagement(id, version) {
1146
+ this.needleApi.serverGradle.addPluginToPluginManagement(id, version);
1147
+ }
1148
+
1139
1149
  /**
1140
1150
  * Add Gradle plugin to the plugins block
1141
1151
  *
@@ -1201,6 +1211,17 @@ module.exports = class JHipsterBaseGenerator extends PrivateBase {
1201
1211
  this.needleApi.serverGradle.addMavenRepository(url, username, password);
1202
1212
  }
1203
1213
 
1214
+ /**
1215
+ * Add a remote Maven repository to the Gradle plugin management block in settings.gradle
1216
+ *
1217
+ * @param {string} url - url of the repository
1218
+ * @param {string} username - (optional) username of the repository credentials
1219
+ * @param {string} password - (optional) password of the repository credentials
1220
+ */
1221
+ addGradlePluginManagementRepository(url, username, password) {
1222
+ this.needleApi.serverGradle.addPluginManagementRepository(url, username, password);
1223
+ }
1224
+
1204
1225
  /**
1205
1226
  * Generate a date to be used by Liquibase changelogs.
1206
1227
  *
@@ -2719,6 +2740,14 @@ templates: ${JSON.stringify(existingTemplates, null, 2)}`;
2719
2740
  this.jhipsterConfig.pkType = options.pkType;
2720
2741
  }
2721
2742
 
2743
+ if (options.cacheProvider !== undefined) {
2744
+ this.jhipsterConfig.cacheProvider = options.cacheProvider;
2745
+ }
2746
+
2747
+ if (options.enableHibernateCache !== undefined) {
2748
+ this.jhipsterConfig.enableHibernateCache = options.enableHibernateCache;
2749
+ }
2750
+
2722
2751
  if (options.microfrontend) {
2723
2752
  this.jhipsterConfig.microfrontend = options.microfrontend;
2724
2753
  }