No 2. JPA(Hibernate) + MySql 5.x 整合

No 2. JPA(Hibernate) + MySql 5.x 整合

注意提前安装好MySQL服务才能继续,本节。

1. 创建目录结构

在这里插入图片描述

2. 新增 JPA , MySql 依赖(pom.xml)

<!--mysql 依赖-->
<!--mysql依赖 与JPA 的依赖顺序会导致导包不成功-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

3. 更新配置文件(application.properties)

server.port=9527

# ============================== MySQL?? =============================================================================
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/jwtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver

# =================================== JPA ===============================================================================
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query ???? sql ??
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update) ?? create ???create????????????????????????
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.DefaultNamingStrategy
# stripped before adding them to the entity manager ????
#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

4. 完善项目结构

4.1 实体类基类
package com.lc.data.domain;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * 抽象实体类
 */
@MappedSuperclass
@Data
@EntityListeners(AuditingEntityListener.class)
@Setter
@Getter
public abstract class BaseEntity implements Serializable {

    //https://www.jianshu.com/p/3b384e873232
    @Id
//    @GenericGenerator(name = "uuid-key", strategy = "uuid2")
    //自定义主键没搞通常
//    @GenericGenerator(name = "uuidKey" ,strategy = "com.lc.data.utils.MyUuidKeyGenerator") //自定UUid
    @GenericGenerator(name = "uuidKey" ,strategy = "org.hibernate.id.UUIDGenerator") // 框子已实现的主键策略
    @GeneratedValue(generator = "uuidKey")
    @Column(length = 36)
    private String id;

    @CreatedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @LastModifiedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

}

4.1.1 创建实体类User
package com.example.createpj.data.entity.security;

import com.lc.data.domain.BaseEntity;
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;

//@Data   //moke 测试?
@Entity(name = "user")
public class User extends BaseEntity {

    @Column(length = 32)
    public String name;

    @Column(length = 18)
    public String username;

    public Integer status;

}

4.2 创建对应的 dao,service,controller层
package com.example.createpj.data.service;

import com.example.createpj.data.entity.security.User;
import com.example.createpj.repository.UserRepository;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class UserService {

    @Autowired
    UserRepository userRepository;

    public User saveUser(User user, Boolean isFlush) {
        return userRepository.save(user);
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public List<User> getByName(String name) {
        return userRepository.getByName(name);
    }

    public List<User> getByUsername(String username) {
        return userRepository.getByUsername(username);
    }


}

package com.example.createpj.repository;

import com.example.createpj.data.entity.security.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<User, String> {

    List<User> getByName(String name);

    List<User> getByUsername(String username);

    List<User> findAll();

}

package com.example.createpj.data.utils;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Result {

    private int code = 200;
    private String msg = "操作成功";
    private Object data;

    public Result(int code,String msg){
        this.code = code;
        this.msg = msg;
    }

    public Result(Object data){
        this.data = data;
    }

}

package com.example.createpj.data.utils;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;
import java.util.UUID;

/**
 * 自定义主键生成策略
 * com.lc.data.utils.MyIdGenerator IdentityGenerator
 */
public class MyUuidKeyGenerator implements IdentifierGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
        return (Serializable)UUID.randomUUID().toString();
    }

}



package com.example.createpj;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing      //使注解自动插入时间的注解生效 @CreatedDate @LastModifiedDate
public class CreatePjApplication {

    public static void main(String[] args) {
        SpringApplication.run(CreatePjApplication.class, args);
    }

}

5. 启动,并访问接口插入第一条数据

5.1 查看表是否新建成功

在这里插入图片描述

5.2 访问接口插入第一条数据

点击新增:localhost:9527/user/saveUser?username=12323491&name=测试过h1216

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyZgcZyI-1679717602288)(image/17_RXYz-vXrKZ.png)]

确认是否新增成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QXKJvbo-1679717602289)(image/18_b2DNesr11f.png)]

本节结束。

<think>好的,用户之前遇到了Spring Boot启动失败的问题,具体是DataSource配置错误和未指定JDBC URL。现在用户又提供了新的引用信息,其中提到绑定'spring.datasource.type'属性时的转换错误,以及一些Activiti相关的Bug。我需要结合之前的解决方案和新的引用信息,帮助用户解决当前的问题。 首先,用户当前的错误信息是关于无法将字符串转换为Class类型,具体是'spring.datasource.type'属性。根据引用[1],这个错误是因为配置文件中将spring.datasource.type的值写成了字符串形式,而实际上应该是一个类名。例如,用户可能错误地写成了cxom.zaxxer.hikari.HikariDataSource,但正确的应该是全限定类名com.zaxxer.hikari.HikariDataSource,或者可能拼写错误。这里需要检查配置文件中的这个属性是否正确。 其次,用户之前的问题是关于DataSource配置错误和未指定JDBC URL。之前的解决方案已经涵盖了配置JDBC URL、驱动类、使用嵌入式数据库、多环境配置、依赖冲突等方面。现在需要结合新的错误信息,补充如何处理类型转换的问题。 需要检查用户是否在application.properties中错误地配置了spring.datasource.type。例如,是否拼写错误,或者是否错误地使用了字符串而不是类名。比如,用户可能在配置文件中写了spring.datasource.type=HikariDataSource,但正确的应该是全限定类名,如spring.datasource.type=com.zaxxer.hikari.HikariDataSource。 另外,引用[2]提到Activiti的一些Bug,可能和用户当前的问题无关,但需要注意如果用户的项目中使用了Activiti,可能需要检查相关配置,尤其是数据库相关的设置是否与Spring Boot的DataSource配置冲突。 接下来,需要整合之前的解决方案和新的错误信息,给出具体的解决步骤。例如: 1. 检查并修正'spring.datasource.type'的配置,确保类名正确且完整。 2. 确保JDBC URL、驱动类、用户名和密码正确配置,特别是MySQL 8.x的驱动类名和URL参数。 3. 检查依赖是否正确,比如HikariCP的依赖是否引入,或者是否有版本冲突。 4. 如果使用多数据源或自定义数据源,可能需要排除自动配置,手动配置DataSource。 同时,用户可能遇到的问题还可能包括依赖缺失,比如没有添加HikariCP的依赖,或者版本不兼容。需要提示用户检查pom.xml或build.gradle中的依赖项。 另外,用户可能需要了解如何排除自动配置,特别是在使用多个数据源的情况下,可以通过@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})来禁用自动配置,然后手动配置DataSource。 最后,确保用户了解如何验证配置是否正确,比如通过启用调试模式查看详细的启动日志,或者使用Spring Boot的Actuator来检查配置属性。</think>#### 解决方案分步说明 (整合最新引用信息) --- ### 1. **修正`spring.datasource.type`类型转换错误** 根据引用[^1],此错误是由于**类名书写格式错误**或**依赖缺失**导致。需按以下步骤修正: ```properties # ✅ 正确配置(注意全限定类名) spring.datasource.type=com.zaxxer.hikari.HikariDataSource # 非cxom.zaxxer... ``` **关键操作**: - **检查拼写**:确认`com.zaxxer.hikari.HikariDataSource`没有拼写错误 - **添加HikariCP依赖**(若未自动引入): ```xml <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>4.0.3</version> <!-- 与Spring Boot 2.x兼容 --> </dependency> ``` - **版本兼容性**:Spring Boot 2.4+默认使用HikariCP,无需显式配置类型[^1] --- ### 2. **核心JDBC配置修复** 结合原始错误`Failed to configure a DataSource`,必须确保以下配置完整: ```properties # ✅ MySQL 8.x标准配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 ``` **验证方法**: - 使用`telnet localhost 3306`确认数据库可访问 - 通过MySQL Workbench手动测试连接 --- ### 3. **依赖树分析与冲突解决** 使用Maven检查依赖冲突(特别是旧版JDBC驱动): ```bash mvn dependency:tree -Dincludes=mysql:*,hikari* ``` 若发现冲突,添加排除声明: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <!-- 排除旧版本 --> </exclusion> </exclusions> </dependency> ``` --- ### 4. **禁用自动配置(多数据源场景)** 当需要自定义数据源时,在启动类添加排除项: ```java @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class }) public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` --- ### 5. **Activiti集成特别配置** 根据引用[^2],若使用Activiti工作流引擎,需额外配置: ```properties # 修复REST API查询问题(如assigneeLike不生效) spring.activiti.database-schema-update=true spring.activiti.check-process-definitions=false # 自定义Webservice端点(引用[^2]改进项) activiti.rest.service.root=http://localhost:8080/engine-rest ``` --- ### 配置验证流程图(更新版) ```mermaid graph TD A[启动失败] --> B{错误类型} B -->|Missing DataSource URL| C[检查application.properties] B -->|Class conversion error| D[验证spring.datasource.type] B -->|Driver not found| E[检查JDBC依赖] C --> F[确认URL格式正确?] D --> G[检查HikariCP依赖] E --> H[运行mvn dependency:tree] ``` --- ### 相关问题 1. **如何在Spring Boot中配置连接池监控?** (通过`/actuator/hikaricp`端点暴露连接池状态) 2. **Activiti与JPA同时使用时出现表名冲突怎么办?** (配置`spring.jpa.hibernate.physical_naming_strategy=自定义命名策略`) 3. **如何为不同的Profile加载不同的SQL初始化脚本?** (使用`spring.config.activate.on-profile=dev`配合`spring.sql.init`) 4. **HikariCP出现ConnectionTimeout异常如何调优?** (调整`spring.datasource.hikari.connection-timeout=30000`及`maximum-pool-size`) --- 通过以上步骤可解决`DataSource`配置相关的95%问题。若仍存在问题,建议: 1. 运行`mvn spring-boot:run -Ddebug`查看详细条件报告 2. 检查数据库用户权限(如`GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'%';`)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值