使用自动创建表时,Hibernate 不会自动为数据库创建序列
Posted
技术标签:
【中文标题】使用自动创建表时,Hibernate 不会自动为数据库创建序列【英文标题】:Hibernate is not auto creating sequencies to database when using auto creating of tables 【发布时间】:2011-04-05 04:47:04 【问题描述】:我想使用 Hibernate 和 Postgresql 自动创建我的数据库表,但我收到有关序列的错误。是否可以使用 Hibernate 自动创建序列,还是我手动生成序列?
我的实体示例:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(uniqueConstraints = @UniqueConstraint( columnNames = "id" ) )
@SequenceGenerator(name="SEQ_EXAMPLE_ID", sequenceName="example_id_seq", allocationSize=1)
public class Example
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EXAMPLE_ID")
private Long id;
public Long getId()
return id;
public void setId(Long id)
this.id = id;
public String g
休眠配置:
hbm2ddl.auto=create-drop
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=true
例外情况:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value
org.postgresql.util.PSQLException: ERROR: relation "example_id_seq" does not exist
【问题讨论】:
您的映射似乎正确。只是为了好奇:Postgre 支持序列吗? 【参考方案1】:您的映射似乎正确,我建议激活以下类别的日志记录以查看究竟发生了什么:
org.hibernate.tool.hbm2ddl
:记录所有执行的 SQL DDL 语句
将其设置为 DEBUG
并检查 DDL 语句(也许用相关部分更新问题)。
PS:allocationSize=1
不是很明智,使用默认值会更好。但这无关紧要。
参考文献
Hibernate 核心参考指南 3.5. Logging【讨论】:
我什至没有看到任何东西,甚至打开了登录。【参考方案2】:您必须在application.properties
中启用自动架构创建,如Hibernate docs 中所述:
hibernate.hbm2ddl.auto = create
或者在使用 Spring 时:
spring.jpa.hibernate.ddl-auto = create
但一般建议是不要在生产中使用它,请参阅Hibernate: hbm2ddl.auto=update in production?
改用Liquibase 或Flyway 等数据库架构迁移工具。
【讨论】:
【参考方案3】:这是我的解决方案。适用于 Postgres
<hibernate-mapping>
<!-- ... -->
<database-object>
<create>CREATE SEQUENCE my_sequence</create>
<drop>DROP SEQUENCE IF EXISTS my_sequence</drop>
</database-object>
</hibernate-mapping>
【讨论】:
【参考方案4】:-我们不能使用 hbm2ddl 属性创建序列 - 我们可以创建任意数量的表,但不能创建序列
序列是特定于数据库的,我们必须在数据库中创建自己的序列
【讨论】:
以上是关于使用自动创建表时,Hibernate 不会自动为数据库创建序列的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate框架hibernate.cfg.xml配置文件,配置自动生成表结构策略。
为啥即使使用 hibernate.hbm2ddl.auto" value="create",hibernate 也不会自动创建表?