2012-07-23 54 views
0

我有兩個表,文檔和修訂版。一個文檔可能有很多修訂版本,而一個修訂版本只有一個文檔。當我嘗試從文檔中檢索版本時,我得到一個異常(請參閱附帶的完整堆棧跟蹤)。Hibernate:索引描述符在SQL Server 2008上無效

如果我檢索它的工作版本,我可以得到它的相關文檔。問題在於獲取修訂集的文檔。

在MySQL上試過,工作正常。感謝您的幫助,請參閱附所有相關信息:

數據庫配置:

CREATE TABLE [dbo].[DOCUMENTS](
    [ID_DOCUMENT] [int] NOT NULL, 
    [NAME] [varchar](255) NULL) 
) ON [PRIMARY] 

CREATE TABLE [dbo].[VERSIONS](
    [ID_VERSION] [int] NOT NULL, 
    [ID_DOCUMENT] [int] NOT NULL 
) ON [PRIMARY] 

Hibernate配置文件

的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">sun.jdbc.odbc.JdbcOdbcDriver</property> 
     <property name="hibernate.connection.url">jdbc:odbc:documental</property 
     <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> 
     <mapping resource="mappings/Document.hbm.xml"/> 
     <mapping resource="mappings/Version.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

文件。 hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="entities.Document" table="DOCUMENTS"> 
     <id name="idDocument" type="java.lang.Integer" column="ID_DOCUMENT"> 
      <generator class="increment"/> 
     </id> 
     <set name="versions" table="VERSIONS" inverse="true"> 
      <key column="ID_DOCUMENT" /> 
      <one-to-many class="entities.Version" /> 
     </set> 
    </class> 
</hibernate-mapping> 

Version.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="entities.Version" table="VERSIONS"> 
     <id name="idVersion" type="java.lang.Integer" column="ID_VERSION"> 
      <generator class="increment"/> 
     </id> 
     <many-to-one name="document" class="entities.Document" fetch="select"> 
      <column name="ID_DOCUMENT" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

Java類

Document.java

public class Document implements Serializable { 
    private java.lang.Integer idDocument; 
    private Set<Version> versions; 

    public Document(){} 

    //Autogenerated getters and setters 
} 

Version.java

public class Version implements Serializable { 
    private java.lang.Integer idVersion; 
    private Document document; 

    public Version(){} 

    //Autogenerated getters and setters 
} 

完整的堆棧跟蹤

>Exception occurred in target VM: could not initialize a collection: [entities.Document.versions#1] 
org.hibernate.exception.GenericJDBCException: could not initialize a collection: [entities.Document.versions#1] 
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
at org.hibernate.loader.Loader.loadCollection(Loader.java:2001) 
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36) 
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565) 
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60) 
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716) 
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344) 
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86) 
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109) 
at org.hibernate.collection.PersistentSet.size(PersistentSet.java:139) 
at servlets.LoginAction.execute(LoginAction.java:33) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

Caused by: java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Índice descriptor no válido 
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6956) 
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7113) 
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc.java:3810) 
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(JdbcOdbcResultSet.java:5637) 
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:582) 
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:600) 
at org.hibernate.type.IntegerType.get(IntegerType.java:28) 
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163) 
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154) 
at org.hibernate.persister.collection.AbstractCollectionPersister.readKey(AbstractCollectionPersister.java:734) 
at org.hibernate.loader.Loader.readCollectionElement(Loader.java:975) 
at org.hibernate.loader.Loader.readCollectionElements(Loader.java:646) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:591) 
at org.hibernate.loader.Loader.doQuery(Loader.java:701) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
at org.hibernate.loader.Loader.loadCollection(Loader.java:1994) 
... 31 more 

回答

0

解決不斷變化的驅動程序jDTS(http://jtds.sourceforge.net/)。