2016-04-04 8 views
2
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; 
     } 

    } 

die andere Modellklasse usedeails ist das ist mein anderes Modell Klasse: Import java.util.HashSet; importieren Sie java.util.Set;Exception in thread "main" org.hibernate.exception.SQLGrammarException: ORA-00926: fehlende Werte Stichwort

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")/*, [email protected](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 

bitte helfen Sie mir, diesen Fehler zu lösen ..getting einige fehlende Wert Schlüsselwörter. Hinweis: der Fehler wird erst nach

+0

Lassen Sie mich raten, COLLECTION-TABLE ist der falsche Name der Tabelle? –

+0

Wenn Sie den gleichen Fehler in einem minimalen Beispiel reproduzieren können, ist es viel wahrscheinlicher, dass Leute den Code lesen und den Fehler erkennen. :-) –

+0

Site-Richtlinien erlauben es Benutzern nicht, Fragen zu vandalisieren, nicht einmal ihre eigenen: Ich habe die destruktive Bearbeitung zurückgerollt. – DSM

Antwort

3

Das Problem in den SQL addding ist, dass das Minuszeichen in den Tabellennamen „COLLECTION-TABLE“ ist kein gültiges Zeichen in einem Bezeichner ohne Anführungszeichen.

ist verdächtig, dass dies:

@JoinTable(name="COLLECTION-TABLE") 

sollte wirklich sein: (! Verrückt)

@JoinTable(name="COLLECTION_TABLE") 

Wenn Sie wirklich ein Minuszeichen in Ihrem Tabellennamen wollen, dann müssen Sie umfassen die (passend entkomme) zitieren Zeichen in den Namen. Wie dies für Oracle:

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

Referenz: https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/mapping.html#mapping-quotedidentifiers

Verwandte Themen