在mysql中通过spring Boot 实体注解创建了两个名为blog和blog_seq的表

nsc4cvqm  于 2023-05-05  发布在  Mysql
关注(0)|答案(3)|浏览(116)

我是新的Spring Boot和这样的事情,这是第一个项目,我试图探索和以下讲座项目创建,我做了一个实体类与@Entity@Table注解,当我执行项目,两个表在mysql数据库得到创建即blogblog_seq,我想了解这个blog_seq是如何创建的,以及它对这个表的意义是什么。
Entity类:

package com.SpringBoot.blog.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;

@Entity
@Table(name = "posts", uniqueConstraints = {@UniqueConstraint(columnNames = {"titles"})})
public class Posts {
        @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @Column(name = "titles", nullable = false)
    private String title;
    @Column(name = "description", nullable = false)
    private String description;
    @Column(name = "content", nullable = false)
    private String content;

    public Posts() {
        super();
    }

    public Posts(long id, String title, String description, String content) {
        super();
        this.id = id;
        this.title = title;
        this.description = description;
        this.content = content;
    }

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
 
}

application.properties

spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/blog
spring.datasource.userName=root
spring.datasource.password=123456789
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update

mysql工作台:

谢谢你的帮助!!
尝试稍微更改实体注解和application.properties,但不起作用。

erhoui1w

erhoui1w1#

它的发生主要是由于:

@GeneratedValue(strategy=GenerationType.AUTO)

AUTO策略使用数据库序列为id列生成唯一值。如果您记录SQL查询,那么您将能够看到针对blog_seq的额外查询,以选择下一个唯一值。
如果这不是你所期望的,那么你可以用途:

@GeneratedValue(strategy=GenerationType.IDENTITY)

它将使用数据库auto-increment id列,并让数据库为id列生成下一个值。
这可能对您的项目没有太大影响,但请阅读这两种策略的性能影响。

编辑:

发现这篇文章很好地解释了这些策略。它会帮助你。
https://thorben-janssen.com/jpa-generate-primary-keys/

nue99wik

nue99wik2#

Hibernate需要为每个实体提供唯一的标识符。它是在数据库表posts中用@Id和相应列id注解的字段。这个字段可以由应用程序在创建新实体(插入新行)时提供,但是很难维护。通常,ID将由数据库或hibernate自动生成。这可以通过注解@GeneratedValue进行配置。
在这个例子中,你已经定义了GenerationType.AUTO。这意味着Hibernate可以决定使用哪种id生成。取决于数据库。大多数情况下,它会选择一个数据库序列。MySQL不支持序列。这就是为什么Hibernate要创建一个单独的表来模拟序列。这正是您可以看到的posts_seq表。只有next_val列保存posts表的id的当前值。

iq3niunx

iq3niunx3#

A sequence is a user-defined schema-bound object that yields a sequence of integers based on a specified specification
简单地说,它生成序列中的数字。This should give a better idea
在本例中,posts_seq是与posts表关联的序列生成器。这里使用它来生成idposts_seqnext_value的值将用于为插入posts表的下一行生成idMore info

相关问题