【问题标题】:hibernate problems about configuring oracle sequencehibernate配置oracle序列的问题
【发布时间】:2017-05-05 18:17:37
【问题描述】:

这是域对象:

package com.hibernate.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="person_inf")
public class Person {
    @Id
    @Column(name="person_id")
    @SequenceGenerator(name="seq_pk",sequenceName="seq_pk",initialValue=1,allocationSize=1)
    @GeneratedValue(generator="seq_pk",strategy=GenerationType.SEQUENCE)
    private Integer id;
    private String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

这是测试类:

package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import com.hibernate.entity.Person;
public class PersonManager {
    public static void main(String[] args) {
        Configuration conf = new Configuration().configure();
        ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
        SessionFactory sf = conf.buildSessionFactory(sr);
        Session ss = sf.openSession();
        Transaction t = ss.beginTransaction();
        Person p = new Person();
        p.setName("zkf");
        ss.save(p);
        t.commit();
        ss.close();
        sf.close();
    }
}

这是hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.username">system</property>
        <property name="connection.password">zkf</property>  
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
       <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521/orcl</property>
        <property name="hibernate.dialect">org.hibernate.dialect.TimesTenDialect</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping class="com.hibernate.entity.School"/>
        <mapping class="com.hibernate.entity.Person"/>
    </session-factory>
</hibernate-configuration>

这是sql语句(我用oracle开发者)

create table person_inf (
  person_id int primary key,
  name varchar(20)
);
create sequence seq_pk start with 1 increment by 1 minvalue 1 nomaxvalue;

错误!这是错误:

错误:ORA-00923:找不到必要的 FROM 关键字

线程“主”org.hibernate.exception.SQLGrammarException 中的异常:无法提取 ResultSet 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:89) 在 org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122) 在 org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:73) 在 org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 在 org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 在 org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 在 org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 在 org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 在 com.hibernate.test.PersonManager.main(PersonManager.java:23) 原因:java.sql.SQLSyntaxErrorException: ORA-00923: 找不到必要的 FROM 关键字

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)
... 12 more

发生了什么?我不知道到底哪里出错了。 谢谢!

【问题讨论】:

    标签: oracle hibernate jakarta-ee


    【解决方案1】:

    您可以尝试将“名称”列名称更改为其他名称吗?

    【讨论】:

    • 好像不是这种问题。我尝试将名称更改为 vname @Column(name="vname") private String vname;包括数据库中的数据
    • 你可以尝试通过 sql devolper 选择并插入表中的值,看看它是否有效?也可以尝试从 sql devoloper 中选择你的序列
    猜你喜欢
    • 2013-02-07
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2015-01-13
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多