SQL序列:Hibernate和Liquibase

时间:2018-02-01 21:04:40

标签: java sql hibernate liquibase

我对数据库的开发还很陌生,所以也许这个问题并不完全是现实,但是如果有人能让我对它更清楚一点,我会很感激......我已经阅读了关于序列的所有内容,以及如何他们比身份更受欢迎。我有一个假设的问题。如果我使用序列来生成我的PK以及Hibernate(数据插入)和Liquibase(模式创建),那么定义序列的正确位置是什么?

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

User.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
}

或其他示例:在架构级别生成序列。

changelog.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>

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

3 个答案:

答案 0 :(得分:2)

按班级User中的行

@SequenceGenerator(name = "USER_SEQ", sequenceName = "USER_SEQ")
@GeneratedValue(strategy = SEQUENCE, generator = "USER_SEQ")

你说要休眠:对于插入数据库的每个对象User,从名为USER_SEQ的序列中为主键提供新值。

通过将描述的changeSet添加到liquibase xml脚本,您可以对liquibase说:如果此changeSet尚未应用于数据库,则下次在名为user_seq的数据库序列中创建。

换句话说,在liquibase脚本中,您可以创建序列,并在类User的代码中使用它。

答案 1 :(得分:1)

如果你想要的是自动生成的id主键,那么可以使用JPA实现(如Hibernate或其他)简单地完成以下操作:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;

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

使用liquibase,在您的base changelog 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>

答案 2 :(得分:0)

您的问题有点误导,因为它与两个不同的事物有关:

  • 生成实体标识符(您的应用程序的行为)和
  • 基础数据库架构的定义。

“如果我要使用序列与Hibernate(数据插入)和Liquibase(模式创建)一起生成我的PK,那么定义序列的正确位置是什么?”

您可以用许多不同的方式定义序列。它总是以SQL语句结尾,但是有时您可能更喜欢使用Liquibase,Flyway或Hibernate来进行DDL自动导出(Hibernate hbm2ddl.auto possible values and what they do?)。

我个人的喜好是在初始开发过程中依靠Hibernate自动模式导出,以后再使用某些上述基于版本的数据库迁移工具。