Spring Boot + JPA + mysql ...错误的方法?

Posted

技术标签:

【中文标题】Spring Boot + JPA + mysql ...错误的方法?【英文标题】:Spring Boot + JPA + mysql ... wrong approach? 【发布时间】:2017-11-17 01:26:55 【问题描述】:

我在这里有一个一般性问题,因为我现在真的很沮丧和不确定。

我有:

工作 php REST API 丑陋的 mysql 数据库

并想将其重构为:

Spring Boot 微服务 使用 JPA/休眠 MySQL 数据库

我在本地 fabric8 集群上运行了一个 Spring 引导服务。

现在我想访问 MySQL 数据库。

使用 Dali Eclipse 创建了 POJO / 实体(Hibernate 或 JPA 2.1 都尝试过)

试过简单的CRUDRepository.findAll()

问题就从这里开始了(之前有很多,但还可以)

    生成的 POJO 和 DB 存在命名约定问题 通过配置解决:

    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

    Eclipse 中的几个 JDBC 驱动程序和类版本问题必须使用下载的 jar 手动修复。

    带有 crudRepo.findAll() 的无限循环导致递归 POJO 关系 解决:

    在每个 @OneToMany 下设置一个 @JsonManagedReference@JsonBackReferenceunder EACH @ManyToOne

我知道事情会变得更复杂,因为我有数据库请求只需要一个表中的一些值,另一方面一些请求基于 几个表(连接) 我遇到了找到描述此类用例的正确文档的问题。 还是只需要为每个 UseCase 创建一个自己的 POJO??

现在我的问题是:

我有正确的方法还是有更好的建议? 我错过了哪些可以解释此类问题的文档?

自从我开始这个项目以来,事情往往不会按预期工作,如果我做对了,我会很挣扎。 尤其是 MySQL DB 访问 似乎与 Hibernate/Spring-boot 存在很大问题。

我之前和 JPA 一起工作过,觉得它很舒服,但现在它看起来太复杂了。

如果您能就此分享您的想法,我将不胜感激!

【问题讨论】:

JsonBackReference 是杰克逊注解,所以如果它解决递归问题,它们与 JPA 或 spring-boot 无关。您正在使用多种技术来做非常不同的事情 JSONJavaDB 并且必须拥有适合每条腿的模型、配置和 jar。您没有提出我们可以提供帮助的问题,因为我们不知道您采用的是什么方法,而且无论如何它都是基于意见的。有许多 JPA 演示和教程可供您查看并适应您的需求。 也许这正是我需要听到(阅读)的。有这么多部分一起工作,所以我失去了概述什么症状是由什么引起的......在我继续之前,我会花一些时间来获得更好的概述。谢谢你的小脑袋。 【参考方案1】:
    如前所述,如果您使用注释或 xml 正确映射列名,则可以跳过命名约定部分。 如果您开始使用带有 hql 和命名查询的 hibernate,我会建议您。如果最初有存储过程,请再次使用命名查询。 如果您采用微服务方式,Spring Boot 会非常方便,但在此之前您需要实现一个绑定工具,如 maven。只需更改 pom.xml 中的最新版本号,即可让最新的 jar 自动出现在类路径中(已下载)。最初,该过程可能看起来难以捉摸且耗时,但它将帮助您的团队在未来获得很多灵活性。

【讨论】:

谢谢,这很重要。我会记住这一点的。 @GregorSklorz 不客气。考虑首先使用 maven,这是一种用于微服务和健康的测试工具,或者是所有微服务的注册表管理器。 @GregorSklorz 如果您喜欢这个答案,请点赞。【参考方案2】:

当然,Spring (Boot) 是巨大的,一开始它可能会让人不知所措——尤其是如果你添加了 web 和持久层——但如果你知道从哪里开始,它几乎可以很容易地实现任何需求。

“生成的 POJO”到底是什么意思?通常您手动编写 Java 实体并使用注释(或 XML)定义到(已经存在的)数据库模式的映射,例如一个简单的 Hibernate 映射可能类似于 this。因此,如果您这样做,就不应该再有命名问题了。

“使用下载的 jars 手动修复”的解决方案听起来很奇怪,最好使用像 maven 或 gradle 这样的依赖管理工具。例如。如果某些东西不符合您的需求,您还可以使用 maven include / exclude 某些依赖项。 Spring 确实支持 maven 和 gradle 开箱即用。

here 可以找到很多 JSON / Jackson 教程,baeldung site 通常是寻找 spring 教程的好点。

要管理诸如“仅来自一个表的一些值”或“几个表(连接)”之类的事情,Spring Data JPA 尤其是Spring Data JPA Projections 很有用,但要注意生成查询的问题。一般来说,关于映射和持久性的知识的一个很好的来源是Vlad's Blog。如果你想在没有 Spring Data JPA 的情况下工作,还有Hibernate result set mappings。

【讨论】:

"Generated POJOs" 由 eclipse 中的 Dali 工具自动创建。但也包括所有关系。 啊,好的。我不知道那个工具。但是手动编写实体更可靠,恕我直言。

以上是关于Spring Boot + JPA + mysql ...错误的方法?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot jpa 访问 mysql

Spring Boot、JPA 和 MySQL 返回空结果

spring boot + JPA + MySql + Entity 表生成大写

spring boot 通过jpa连接mysql失败

Spring Boot 最佳实践Spring Data JPA 操作 MySQL 8

spring boot+spring data jpa+gradle+mysql配置问题