【发布时间】:2018-05-15 16:22:10
【问题描述】:
我正在使用 JPA 实体。
我像这样创建了一个新的:
@Entity
public class Entity {
@Id
@GeneratedValue(generator = "Entity_Sequence", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "Entity_Sequence", sequenceName = "Entity_Seq")
private Long id;
// ... other fields
}
生成的 SQL 我用来创建 DB 对象:
CREATE SEQUENCE ENTITY_SEQ START WITH 1 INCREMENT BY 50;
CREATE TABLE ENTITY (
ID NUMBER(19, 0) NOT NULL,
-- ... other fields
PRIMARY KEY (ID)
);
现在,我可以从 SQL Developer 和 IntelliJ 查询序列的 nextval。但是当我尝试从代码中持久化实体时,Hibernate 会抛出以下异常:
15:21:11,022 INFO [stdout] (EJB default - 2) Hibernate: select ENTITY_SEQ.nextval from dual
15:21:11,037 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 2) SQL Error: 2289, SQLState: 42000
15:21:11,037 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 2) ORA-02289: Sequence ist nicht vorhanden.
(“Sequence ist nicht vorhanden”翻译为“序列不存在”。)
为什么我在 Hibernate 找不到序列?
编辑 1 (12-01):
我尝试了建议的answer from Olivier,但错误仍然相同。
编辑 2 (12-01):
由于 Olivier 删除了他的答案,他建议我将 @SequenceGenerator 注释移至班级。
【问题讨论】:
-
你确定hibernate连接到正确的数据库吗?
-
@OlivierGrégoire 是的,所有其他实体都可以工作(我在一年前创建,但结构相同)
-
Oracle 通常不区分大小写,但请尝试在您的实体中将您的表名大写:
sequenceName = "ENTITY_SEQ"。 -
@OlivierGrégoire 我也试过了,还是没有。我还使用了一个自定义的 NamingStrategy,它已经将名称转换为 UPPER_CASE。
-
该数据库是否有多个用户?是否有可能您使用特定用户(我们称此用户“admin”)创建了序列和表,但正在与另一个用户(我们称此用户“app”)一起使用休眠?然后,一些脚本可以看到“应用程序”的表,但对序列不做同样的事情吗?