问题标签 [spring-boot-jpa]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1446 浏览

kotlin - Spring Boot JPA 多租户 HikariCP 池快速运行满

我有一个 Spring Boot - JPA - Postgres 多租户设置,其中每个租户都在一个单独的模式中。直到今天,当我尝试创建超过 5 个租户时,一切都运行良好。不,我在启动时遇到了这个异常:

我的 Hikari CP 最大大小为 5。我在 DEBUG 日志中有 Hikari,日志说:

HikariPool-1 - Pool stats (total=5, active=5, idle=0, waiting=0)

据我了解,Hikari 无法释放到不同模式的连接,所以我最终遇到了这个错误。

我的多租户连接提供商是这样的:

如果我将调试器设置为 on releaseConnection,它永远不会去那里。它去了一次,releaseAnyConnection但实际上并没有将连接从活动连接中移开。

所以现在我被困在这里,有点不知道如何继续前进。

如果我向每个租户提出了至少一个请求,则会发生此异常。问题是,当我的应用程序启动时,它会从配置模式中查询所有租户模式名称,然后针对所有这些模式(在循环中)执行 Liquibase 脚本,以确保所有租户模式都是最新的。因此,在启动后,如果我的租户数量多于连接池允许的最大连接数,我肯定会面临这种异常情况。我可以从这个应用程序中删除模式更新,但我仍然希望有数百个同时登录到我的应用程序的租户,所以迟早我仍然会遇到这个问题。通过谷歌搜索,我发现有些人遇到了这个问题,因为他们的查询运行了很长时间,但与多租户无关。

我的应用程序.yml:

Spring Boot 版本为 2.0.5.RELEASE 和 Hikari 2.7.9

0 投票
1 回答
353 浏览

java - Spring JPA中的多对一关联不更新相关实体

我在使用多对一关联在数据库中插入 JPA 实体时遇到问题。

我在用着:

  • Spring Boot 2.1.4.RELEASE
  • Ecliselink 2.7.4.RC2 (org.eclipse.persistence.jpa)
  • spring-boot-starter-数据-jpa

我正在使用 Spring 的存储库,其中只有一个保存方法,没有插入、合并或更新方法。

我使用DbWatchlist与另一个实体具有多对一关联的实体DbWatchlistProvider

如果我创建一个新DBWatchlist的填充字段,DbWatchlistProvider一切正常。此外,如果我更改现有的DbWatchlist以及此处的字段DbWatchlistProvider并进行保存,则一切正常。

但是,如果我尝试DbWatchlist使用现有DbWatchlistProviderJPA 创建一个新的,总是会尝试为DbWatchlistProvider.

我尝试DbWatchlistProvider在插入实体之前从数据库中读取数据,然后DbWatchlist进行保存,但这里也完成了 INSERT。这会导致异常:

我的代码:

在我的测试中,我尝试了以下方法:

直到最后一次保存,一切都正常工作,没有错误,就像预期的那样。有人知道问题出在哪里,为什么DbWatchlistProvider试图插入而不更新?

例外是:

0 投票
1 回答
26 浏览

mysql - 我们可以使用 JPA Repository 从 Mysql View 中提取/获取数据吗?如果是怎么办?

我有很多表,我使用 JPARepository 从中获取数据。然后我在 MySql - View 上创建并尝试使用 JPARepository 来做 findAll 但它不起作用。

0 投票
2 回答
6470 浏览

spring-boot - 如何在一个 MVC 应用程序中结合 @DataJpaTest @SpringBootTest 来测试每一层?

这里https://stackoverflow.com/a/52968130/10894456 很好地解释了为什么 @DataJpaTest @SpringBootTest 不应该混合在一个应用程序中。

但是当无论如何都需要测试 MVC SpringBoot 应用程序的每一层时,几乎没有解释这种情况(从我的角度来看,很自然地不仅要测试一个层或仅测试另一层,而且还要测试两个甚至所有层,不是吗?)

所以有人建议使用@AutoConfigureTestDatabase 而不是@DataJpaTest 但没有完成工作(((

所以我的问题是:使用@AutoConfigureTestDatabase 是一个合适的解决方案吗?如果是,请详细说明。如果没有,请提出更合适的解决方案,谢谢

0 投票
0 回答
1223 浏览

java - Spring CrudRepository 保存方法的自定义返回类型(动态投影)

我想知道是否可以为 Spring 的CrudRepositorysave 方法定义自定义返回类型,如下面的 find 查询方法示例:

在文档中,我只找到了一个使用查询方法进行动态投影的示例。

我试过了

但我收到以下错误:

任何想法如何让这个工作?

0 投票
3 回答
2979 浏览

java - 来自 PostgreSQL 的流行(具有获取大小)

我想从 PostgreSQL 11.2 流式传输结果,而不是一次将所有结果读取到内存中。我使用最新的稳定版 SpringBoot 2.1.4.RELEASE。

我阅读了如何在 MySQL 中执行此操作的文章。 http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html 我还阅读了如何在 PostgreSQL 中进行操作的文章: Java 8 JPA 存储库在 Postgresql 中逐行流式传输

我有这样的存储库:

比我这样使用流:

为了使示例更简单,'export' 方法是完全空的。

当我调用该方法时,我看到了 Hibernate 查询

一段时间后,我有 OutOfMemoryError。查询提示没有帮助。

如何使用 Spring Boot 存储库(甚至 EntityManager)读取数据并以最佳方式从 DB 加载行。我知道我可以进行分页,但正如文章中所写的那样,这不是最理想的方式。

0 投票
1 回答
603 浏览

spring-data - spring-data-geode 的 spring-boot-starter-data-jpa 兼容版本是什么?

有人可以帮我在 Spring Boot 版本中找到兼容的spring-boot-starter-data-jpafor版本吗?spring-data-geode2.1.4.RELEASE

这适用于运行嵌入式缓存服务器的应用程序,该应用程序具有使用 HikariCP 连接到 Oracle RDBMS 的后写实现。

我尝试使用从低到低的spring-boot-starter-data-jpa版本运行我的应用程序,但没有成功。我也尝试过低至for 的版本。2.1.4.RELEASE2.0.8.RELEASE2.1.4.RELEASE2.0.8.RELEASEspring-data-commons

异常堆栈跟踪:

0 投票
2 回答
1963 浏览

java - 用于聚合值的 Spring Boot jpa 查询构建器?

我想创建输出聚合值的可定制查询。我知道三种获取和执行查询的方法,但似乎都不够。我要构建的查询如下所示:

tldr:跳过 1 和 2。

  1. SQL 作为字符串
    • private NamedParameterJdbcTemplate template; template.query("select ..." , new MapSqlParameterSource("...", "...") , rs -> {...rs.getString("minprice")...
    • 优点:我们可以从查询中访问结果
    • 缺点:它没有使用查询构建器:我们必须自己构建“选择...”字符串。
  2. 使用存储库
    • public interface MytableRepository extends CrudRepository<Mytable, Integer> { @Query("Select ...") public List<Object[]> findMinMaxPrice(@Param("myParam") String myParam);
    • Pro:我们可以访问查询的结果。
    • 缺点:查询是硬编码的
  3. 使用查询生成器
    • Specification<MyTable> spec = Specifications.<>where((mytable, query, cb) -> { Predicate sql = cb.equal(mytable.get("k"), "v"; return sql; } List<Mytable> result = myJpaSpecificationExecutor.findall(spec);
    • Pro:它正在使用查询生成器
    • 缺点:查询未使用 groupBy。由于我们的 groupBy 查询不是返回类记录Mytable而是聚合值,所以我不知道如何使这项工作。我开始选择 fromMytable所以我认为我需要将它用作类型参数 to Specification,但这立即意味着结果也应该是 type MyTable,不是吗?

如何使用具有灵活结果类型的查询生成器?

0 投票
1 回答
29 浏览

spring-boot-jpa - 如何将地图集合作为 jpa 查询返回

我有个问题。当我使用 spring data jpa 时,我希望它返回 Map Collections,但它错了。然后我在互联网上搜索找到了解决方案。流动。

但我不认为使用新地图方法是最好的解决方案,我想问一下是否有其他解决方案。谢谢。

0 投票
1 回答
79 浏览

java - Spring JPA 复合 PK 与一个自动递增

我正在尝试使用 Spring Boot 2.1.2.RELEASE + JPA(使用启动器)和 MySQL(InnoDB)来持久化具有复合主键的实体,其中一个应该自动递增。我有一个带有 2 个非抽象子类的抽象类,并且我正在使用单表策略进行继承。

我一直在寻找如何实现这一目标,但每篇似乎都在寻找与我相同的帖子最终都没有答案(示例)。

我当前的设置看起来像这样(为清楚起见,省略了 setter、getter 和构造函数)。

我发现的第一个问题是表生成。如果声明如下,MySQL 允许创建 PK

但不是以不同的顺序

创建表时,Hibernate 使用第二个,因此失败。还尝试更改字段顺序但无济于事。我认为这可能是 Hibernate 的一个问题,但我不确定。任何人都可以确认吗?无论如何,我通过手动创建 DDL 脚本并通过 Hibernate 禁用自动 DDL 解决了这个问题。

下一个问题,我没有找到答案,实体在表中正确保存,但是存储库的save方法返回的id始终为0。我在保存之前手动设置pk2,而离开pk1由数据库完成。

在调试时,我发现了这个isNew() 方法。事实证明它返回 false 因为 MyEntityPK 与 null 不同(我设置了 pk2)。这当然不是我所期望的,因为我实际上是在保存一个新实体,因为我的 PK 是复合的并且我将一个字段留空。所以,我也认为这可能是一个错误。有一些类覆盖了 isNew() 方法,但似乎它们没有被使用。

我做错了什么还是这是一个错误?帮助表示赞赏:)