簡體   English   中英

線程“主” org.hibernate.exception.SQLGrammarException中的異常:ORA-00926:缺少VALUES關鍵字

[英]Exception in thread “main” org.hibernate.exception.SQLGrammarException: ORA-00926: missing VALUES keyword

this is my main code:
package org.javab.hibernate;

import org.hibernate.Session; 
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.javab.Address;
import org.javab.Userdetails;

public class Hibernatetest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Userdetails user = new Userdetails();
        Address addr= new Address();
        addr.setCity("banglore");
        addr.setDoorno("10");
        addr.setStreet("street");
        user.setAddress(addr);


        Address addr1= new Address();
        addr1.setCity("manglore");
        addr1.setDoorno("145");
        addr1.setStreet("addr lane 1");

        user.setAddress(addr1);
        user.getCollectionofaddr().add(addr);
        user.getCollectionofaddr().add(addr1);
        user.setUserid(11);
        user.setUsername("ten");

        @SuppressWarnings("deprecation")
        SessionFactory sessionfactory =new Configuration().configure().buildSessionFactory();
        Session session =sessionfactory.openSession();

        session.beginTransaction(); 

        session.save(user);
        session.getTransaction().commit();

        session.close();
        session =sessionfactory.openSession();

        session.beginTransaction(); 
        user = (Userdetails) session.get(Userdetails.class,4);
        System.out.println("user name "+ user.getUsername());

    }
}


 this is model class:    
    this is model class:
    package org.javab;

    import javax.persistence.Embeddable;

    @Embeddable 
    public class Address {

        private String street;
        private String city;
        private String doorno;
        public String getStreet() {
            return street;
        }
        public void setStreet(String street) {
            this.street = street;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getDoorno() {
            return doorno;
        }
        public void setDoorno(String doorno) {
            this.doorno = doorno;
        }

    }

使用的另一個模型類是這是我的另一個模型類:import java.util.HashSet; 導入java.util.Set;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;

@Entity
public class Userdetails {
    @Id
    private int userid;
    private String username;
    private Address address;
    @ElementCollection
    @JoinTable(name="COLLECTION-TABLE")/*, joinColumns=@JoinColumn(name="user_id"))*/
    private Set<Address> collectionofaddr = new HashSet();
    public Set<Address> getCollectionofaddr() {
        return collectionofaddr;
    }
    public void setCollectionofaddr(Set<Address> collectionofaddr) {
        this.collectionofaddr = collectionofaddr;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }


    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return "username from get"+username;

    }
    public void setUsername(String username) {
        this.username = username;
    }

}



hibernate.cfg.xml
<!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>

    <!-- Database connection settings -->
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="connection.url">jdbc:oracle:thin:@xxx.corp.XXXX.com:1600/xxxxx</property>
    <property name="connection.username">xxxx</property>
    <property name="connection.password">xxxxxxxxr</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <!-- Disable the second-level cache  -->
    <!-- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> -->

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>

    <!-- Name the annotated Entity -->
    <mapping class="org.javab.Userdetails"></mapping>
</session-factory>
</hibernate-configuration>


pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.hibernate</groupId>
  <artifactId>demo.hibernate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>this is name</name>
  <description>this is descriprion</description>

<url>http://maven.apache.org</url>
     <dependencies>

      <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>        
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.1.Final</version>
            <classifier>tests</classifier>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency> 
       <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.0.1.Final</version>
        </dependency>       
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.1.0.CR2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
          </dependencies>


</project>


fnally my error message:
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: insert into Userdetails (city, doorno, street, username, userid) values (?, ?, ?, ?, ?)
Hibernate: insert into COLLECTION-TABLE (Userdetails_userid, city, doorno, street) values (?, ?, ?, ?)
Exception in thread "main" org.hibernate.exception.SQLGrammarException: ORA-00926: missing VALUES keyword

    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at com.sun.proxy.$Proxy11.executeUpdate(Unknown Source)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:272)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:264)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:190)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1081)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:315)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at org.javab.hibernate.Hibernatetest.main(Hibernatetest.java:42)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00926: missing VALUES keyword

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1010)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3657)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    ... 15 more

請幫助我解決此錯誤。.獲取一些缺少值的關鍵字。 注意:錯誤僅在添加后出現

SQL中的問題是表名稱“ COLLECTION-TABLE”中的減號不是未引用標識符中的有效字符。

懷疑這是:

  @JoinTable(name="COLLECTION-TABLE")

真的應該是這樣的:

  @JoinTable(name="COLLECTION_TABLE")

如果您確實要在表名中添加減號(瘋狂!),則需要在名稱中包含(適當轉義的)引號字符。 對於Oracle來說像這樣:

  @JoinTable(name="\"COLLECTION-TABLE\"")

參考: https : //docs.jboss.org/hibernate/orm/3.6/reference/zh-CN/html/mapping.html#mapping-quotedidentifiers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM