我想用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
}
Hibernate配置:
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
答案 0 :(得分:1)
您的映射似乎是正确的,我建议激活以下类别的日志记录以查看正在发生的事情:
org.hibernate.tool.hbm2ddl
:记录执行时的所有SQL DDL语句
将其设置为DEBUG
并检查DDL语句(可能会使用相关部分更新问题)。
PS:allocationSize=1
不是很明智,使用默认值会更好。但那是无关紧要的。
答案 1 :(得分:1)
您必须按照Hibernate docs:
中的说明在application.properties
中启用自动架构创建
hibernate.hbm2ddl.auto = create
或使用Spring时:
spring.jpa.hibernate.ddl-auto = create
但一般建议不在生产中使用,请参阅Hibernate: hbm2ddl.auto=update in production?
答案 2 :(得分:0)
这是我的解决方案。适用于Postgres
<hibernate-mapping>
<!-- ... -->
<database-object>
<create>CREATE SEQUENCE my_sequence</create>
<drop>DROP SEQUENCE IF EXISTS my_sequence</drop>
</database-object>
</hibernate-mapping>
答案 3 :(得分:-2)
- 我们无法使用hbm2ddl属性创建序列 - 我们可以创建任意数量的表,但不能创建序列
序列是db特定的,我们必须在db
中创建自己的序列