Spring Boot with Hibernate:在已经存在时继续创建数据库

Posted

技术标签:

【中文标题】Spring Boot with Hibernate:在已经存在时继续创建数据库【英文标题】:Spring Boot with with Hibernate: Keep Creating Database when already Exist 【发布时间】:2020-03-18 00:14:23 【问题描述】:

我正在使用 Hibernate 开发这个 Spring Boot 应用程序。当我运行 Spring Boot 应用程序时,我不希望 Hibernate 在数据库或表已经存在时创建数据库或表。相反,我只希望它从现有数据库中获取数据或使用现有数据库向其中插入/更新数据。

application.properties

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
db.driver= com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username = developer
spring.datasource.password = 111111

## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

Image.class

@Entity
@Table(name = "Image")
public class Image 

@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Long imageNum;

@NotNull(message = "Product image id is required")
@Column(name = "ProductImgID")
private int productID;

@NotNull(message = "Image name is required")
@Column(name = "ImageUrl")
private String url;

Getter and Setter are below


BookRepository.class

@Repository
public interface BookRepository extends CrudRepository<Image, Long> 


BookService.class

@Service
public class BookService 

private BookRepository repository;

@Autowired
public BookService(BookRepository repository) 
    this.repository = repository;


public List<Image> getImage() 
    List<Image> img = (List<Image>) repository.findAll();
    if (img.size() > 0) 
        for (Image ig : img)
            System.out.println(ig.toString());
        return img;
    
    return new ArrayList<>();
 


BookService.class

@Service
public class BookService 

private BookRepository repository;

@Autowired
public BookService(BookRepository repository) 
    this.repository = repository;


public List<Image> getImage() 
    List<Image> img = (List<Image>) repository.findAll();
    if (img.size() > 0) 
        for (Image ig : img)
            System.out.println(ig.toString());
        return img;
    
    return new ArrayList<>();



**正如您在图像左侧看到的那样,当我运行应用程序时,它会自动添加其中没有数据的三列并将值返回给我。 **

当已经存在一个数据库、表或列时,如何让 Hibernate 创建另一个数据库、表或列?并且只是从数据库中获取现有数据?

【问题讨论】:

【参考方案1】:

将此spring.jpa.hibernate.ddl-auto 属性设置为none

Configure JPA Properties

Spring Data JPA 已经提供了一些独立于供应商的配置选项(例如那些用于 SQL 日志记录的选项),并且 Spring Boot 公开了这些选项以及 Hibernate 的更多选项作为外部配置属性。其中一些是根据上下文自动检测的,因此您不必设置它们。

spring.jpa.hibernate.ddl-auto 是一种特殊情况,因为根据运行时条件,它有不同的默认值。如果使用嵌入式数据库并且没有模式管理器(例如 Liquibase 或 Flyway)正在处理 DataSource,则默认为 create-drop。在所有其他情况下,它默认为无。

【讨论】:

以上是关于Spring Boot with Hibernate:在已经存在时继续创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

grails 3(spring-boot) - 如何配置hibernate二级缓存

《Pro Spring Boot 2》第四章:Web Applications with Spring Boot

《Pro Spring Boot 2》第五章:Data Access with Spring Boot

Spring Boot with Docker

Spring Boot with Spring Data JPA - Concept

Microservices with Spring Boot