当前位置: 首页 > 知识库问答 >
问题:

配置oracle序列的Hibernate问题

唐增
2023-03-14

这是域对象:

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();
    }
}

这是冬眠。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:无法从关键字中找到必需的

html" target="_blank">异常线程"main"org.hibernate.exception.SQLGrammarExc0019:无法提取结果集org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)在org.hibernate.exception.internal.标准SQLExceptionConverter.convert(标准SQLExceptionConverter.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.ResultSetResnImpl.extract(ResultSetResnImpl.java:89)org.hibernate.id.序列enerator.generate持有人(序列enerator.java:122)在org.hibernate.id.序列生成。AbstractSaveEventLister. saeAnd GeneratedId(AbstractSaveEventLister. java: 117)在org. hibernate. evente. interal。DefaultSaveOrUpdateEventLister. SaveBackGeneratedOrRecestedId(DefaultSaveOrUpdateEventLister. java: 209),网址为org. hibernate. evente。DefaultSaveEventListern. saeAnd GeneratedOrRecestedId(DefaultSaveEventListern. java: 55)在org. hibernate. evente. interal。DefaultSaveOrUpdateEventLister. entityIs瞬态(DefaultSaveOrUpdateEventLister. java: 194),网址为org. hibernate. evental。DefaultSaveEventLister. performSaveOrUpdate(DefaultSaveEventLister. java: 49),网址为org. hibernate. eventa。DefaultSaveOrUpdateEventLister. onSaveOrUpdate(DefaultSaveOrUpdateEventLister. java: 90),网址为org. hibernate. interal。SessionImp. fire(SessionInp. java: 715)在org. hibernate. interal。保存(SessionInp. java: 707)在org. hibernate. interal。保存(SessionImp. java: 702)在com. hibernate. test。造成的原因:java. sql.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

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

共有1个答案

仇和蔼
2023-03-14

你能试着把“名字”列的名字改成像人名这样的名字吗?

 类似资料:
  • 问题内容: 我正在使用oracle 11g,Java(struts2)和Hibernate开发应用程序。 我有一个名为mytemp的表,其列mytemp_id为NUMBER(22,0)类型。 在我的mytemp.hbm.xml文件中,ID如下所示 在我的Oracle数据库中,创建了名为“ MYTEMP_TEMP_ID_SEQ”的序列,并在Oracle中正常工作。 现在,当我尝试使用hibernat

  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个ID策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个问题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器为表的PK生成

  • 问题内容: 我有一个表,该表的索引自动由使用序列的触发器填充(Oracle数据库) 我有一个匹配的Java类: 当我尝试持久保存A的实例时,如下所示: 我得到这个问题: 保存调用返回的代码中的ID = “ X” 数据库中的ID = “ X + 1” 有没有一种方法可以设置Hibernate来让数据库触发器创建ID? 谢谢 问题答案: HIbernate问题上发现的与Oracle触发器有关的响应,用

  • 问题内容: 我使用在我的实体上生成ID。 我现在不知道它是如何工作的,但是在我的子表上,它会生成遵循父序列的ID值。 在父级上插入的ID值将更新序列。在子级上插入的ID值将更新序列。在下一个父项插入中,序列…使用由子项插入更新的值… 此注释不会创建两个序列,而只会创建一个。这是正确/预期的吗? 我仅使用插入了具有DAO服务的实体 ; 问题答案: 这些注释不会创建两个序列,而只会创建一个。这是正确/

  • 我经常读这个网站,但这是我第一次写,希望我不会犯错误,并为我糟糕的英语道歉。我说到重点了:我必须开发代码来在postgresql数据库的单个表上插入记录,在一个Spring启动项目上使用Hibernate。这个表有一个序列,我想用它来获取id的值。在我的表的hbm.xml文件中,我有这样一个: 在bean类中,我有变量idTito及其getter和setter方法。 当我试图通过调用实现JpaRe

  • 问题内容: 我正在使用hibernate 3,oracle 10g。我有一张桌子:主题。定义在这里 插入新主题时,sub_seq用于创建主题ID,定义在此处 Subject类是这样的: 在主题表中,数据库中有4555个主题由excel的plsql脚本加载,并且sub_sequence运行良好。主题ID的范围是1–4555。 但是,当我使用hibernate模式从应用程序中添加主题时,序列号跳至25