【问题标题】:Hibernate is not auto creating sequencies to database when using auto creating of tables使用自动创建表时,Hibernate 不会自动为数据库创建序列
【发布时间】: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 支持序列吗?

标签: hibernate postgresql orm sequence hbm2ddl


【解决方案1】:

您的映射似乎正确,我建议激活以下类别的日志记录以查看究竟发生了什么:

  • org.hibernate.tool.hbm2ddl:记录所有执行的 SQL DDL 语句

将其设置为 DEBUG 并检查 DDL 语句(也许用相关部分更新问题)。

PS:allocationSize=1 不是很明智,使用默认值会更好。但这无关紧要。

参考文献

【讨论】:

  • 我什至没有看到任何东西,甚至打开了登录。
【解决方案2】:

您必须在application.properties 中启用自动架构创建,如Hibernate docs 中所述:

hibernate.hbm2ddl.auto = create

或者在使用 Spring 时:

spring.jpa.hibernate.ddl-auto = create

但一般建议是不要在生产中使用它,请参阅Hibernate: hbm2ddl.auto=update in production?

改用LiquibaseFlyway 等数据库架构迁移工具。

【讨论】:

    【解决方案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 属性创建序列 - 我们可以创建任意数量的表,但不能创建序列

      序列是特定于数据库的,我们必须在数据库中创建自己的序列

      【讨论】:

        猜你喜欢
        • 2018-11-19
        • 2014-01-30
        • 2011-05-29
        • 2017-08-23
        • 2021-10-21
        • 2013-12-04
        • 2012-07-02
        • 2018-08-18
        相关资源
        最近更新 更多