我对数据库的开发还很陌生,所以也许这个问题并不完全是现实,但是如果有人能让我对它更清楚一点,我会很感激......我已经阅读了关于序列的所有内容,以及如何他们比身份更受欢迎。我有一个假设的问题。如果我使用序列来生成我的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中定义序列?这两者究竟有什么区别?
答案 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自动模式导出,以后再使用某些上述基于版本的数据库迁移工具。