SQL 序列:Hibernate 和 Liquibase

wes*_*eyy 5 java sql hibernate liquibase

我对数据库开发还很陌生,所以也许这个问题并不完全正确,但如果有人能让我更清楚一点,我将不胜感激......我已经阅读了有关序列的所有内容,以及它们的首选方式超越身份。我有一个假设性问题。如果我要使用序列与 Hibernate(数据插入)和 Liquibase(模式创建)一起生成 PK,那么定义序列的正确位置是什么?

例如:类级别的序列生成。

用户.java

@Entity
@Table(name = "USER")
public class User {

    @Id
    @SequenceGenerator(name = "USER_SEQ", sequenceName = "USER_SEQ")
    @GeneratedValue(strategy = SEQUENCE, generator = "USER_SEQ")
    @Column(name = "ID")
    private Long id;

    // other fields
}
Run Code Online (Sandbox Code Playgroud)

或其他示例:模式级别的序列生成。

变更日志.xml

<changeSet author="wesleyy">
    <createSequence catalogName="cat"
            cycle="true"
            incrementBy="1"
            maxValue="1000"
            minValue="10"
            ordered="true"
            schemaName="public"
            sequenceName="user_seq"
            startValue="1"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

是否需要在 Liquibase 和 Hibernate 中定义序列?两者到底有什么区别?

Faz*_*Faz 3

如果您希望自动生成 id 主键,那么可以使用 Hibernate 或其他 JPA 实现按如下方式简单完成:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
Run Code Online (Sandbox Code Playgroud)

Id 主键将为您自动生成和管理。

使用 liquibase,在您的基本变更日志 xml 文件中,只要您的数据库支持自动生成的 id,您就可以执行以下操作(许多数据库都这样做,但如果不确定,请检查):

  <changeSet author="name" id="auto increment example">
    <createTable tableName="users">
        <column autoIncrement="true" name="id" type="SERIAL">
            <constraints primaryKey="true" primaryKeyName="users_pkey"/>
        </column>
        <column name="some_other_column" type="VARCHAR(255)"/>
        <column name="another_column" type="VARCHAR(255)"/>
    </createTable>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

  • 使用“GenerationType.IDENTITY”时要小心,因为这会禁用批处理。如果您关心性能并且需要大量行。例如参见 https://thorben-janssen.com/hibernate-tips-use-custom-sequence/ (2认同)