休眠/Oracle 序列不工作

Posted

技术标签:

【中文标题】休眠/Oracle 序列不工作【英文标题】:Hibernate/Oracle Sequence not working 【发布时间】:2013-08-06 13:16:12 【问题描述】:

我正在使用 hibernate 和 oracle DB 尝试使用序列将自动 ID 插入到表中。该序列明显存在于数据库中,但 hibernate 似乎无法找到它。

以下是所有相关信息:

SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 SLF4J:默认为无操作(NOP)记录器实现 SLF4J:有关详细信息,请参阅 http://www.slf4j.org/codes.html#StaticLoggerBinder。 org.hibernate.exception.SQLGrammarException:无法获得下一个序列值 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) …… 引起:java.sql.SQLSyntaxErrorException:ORA-02289:序列不存在 …… ... 12 更多

我知道它说“引起:java.sql.SQLSyntaxErrorException:ORA-02289:序列不存在”,但我可以访问数据库上的序列:

表:

CREATE TABLE Property(
  id INT,
  address VARCHAR2(50),
  town VARCHAR2(50),
    postCode VARCHAR2(50),
    purchasePrice INT
);

顺序:

create sequence property_seq start with 1 increment by 1 nomaxvalue; 

映射xml:

<class name="com.rental.model.property.Property" table="PROPERTY">
    <meta attribute="class-description"> This class contains the property detail. </meta>
    <id name="id" type="integer" column="id">
        <generator class="sequence"/>
    </id>
    <property name="address" column="ADDRESS" type="string" />
    <property name="town" column="TOWN" type="string" />
    <property name="postCode" column="POSTCODE" type="string" />
    <property name="purchasePrice" column="PURCHASEPRICE" type="integer" />
</class>

注释:

@Id
@SequenceGenerator(name="property_seq", sequenceName="property_seq", allocationSize=1, initialValue=1) 
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator="property_seq")
public int getId() 
    return id;

【问题讨论】:

序列对象是否创建在与登录到休眠会话的用户相同的架构中?如果没有,您是否创建了同义词并授予对序列的访问权限? 也许可以尝试在 property_seq 上添加一个公共同义词 Hibernate使用的用户与创建序列的用户相同 【参考方案1】:

你为什么同时使用 xml 和 @Annotation?也许 xml 定义胜过注解,而 Hibernate 正在检索默认序列而不是您的 property_seq。 尝试删除 xml 映射并检查它是否有效。

【讨论】:

谢谢贝拉巴克斯。我完全删除了 xml 并添加了所有其他注释,然后将我的工厂更改为:factory = new AnnotationConfiguration().configure().addAnnotatedClass(Property.class)。 buildSessionFactory();

以上是关于休眠/Oracle 序列不工作的主要内容,如果未能解决你的问题,请参考以下文章

休眠序列不存在

hibernate oracle 序列产生大的间隙

检查特定序列是不是存在于休眠中

使用休眠从数据库中获取下一个序列值

无法反序列化 - 休眠弹簧启动

如何解决休眠双向映射导致的json序列化器中的循环引用?