首页 > 解决方案 > SQLite db 文件的相对路径:org.sqlite.SQLiteException: [SQLITE_ERROR] SQL 错误或缺少数据库

问题描述

在我的 java web 应用程序中,我使用 sqlite db 文件。我把它放进去

myproject\src\main\resources\shop.db

在我的春季环境中,我设置:

 <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans
        xmlns="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

        <!-- DispatcherServlet Context: defines this servlet's request-processing 
            infrastructure -->

        <!-- Enables the Spring MVC @Controller programming model -->
        <annotation-driven />

        <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
            up static resources in the ${webappRoot}/resources directory -->
        <resources mapping="/resources/**" location="/resources/" />

        <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
            in the /WEB-INF/views directory -->
        <beans:bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <beans:property name="prefix" value="/WEB-INF/views/" />
            <beans:property name="suffix" value=".jsp" />
        </beans:bean>

        <beans:bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <beans:property name="driverClassName"
                value="org.sqlite.JDBC" />
            <beans:property name="url" value="jdbc:sqlite:shop.db" />
            <beans:property name="username" value="" />
            <beans:property name="password" value="" />
        </beans:bean>

        <!-- Hibernate 4 SessionFactory Bean definition -->
        <beans:bean id="hibernate4AnnotatedSessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <beans:property name="dataSource" ref="dataSource" />
            <beans:property name="annotatedClasses">
                <beans:list>
                    <beans:value>com.myproject.spring.model.Person</beans:value>
                </beans:list>
            </beans:property>
            <beans:property name="hibernateProperties">
                <beans:props>
                    <beans:prop key="hibernate.dialect">org.hibernate.dialect.SQLiteDialect
                    </beans:prop>
                    <beans:prop key="hibernate.show_sql">true</beans:prop>
                    <beans:prop key="hibernate.format_sql">true</beans:prop>
                </beans:props>
            </beans:property>
        </beans:bean>

        <beans:bean id="personDAO"
            class="com.myproject.shop.spring.dao.PersonDAOImpl">
            <beans:property name="sessionFactory"
                ref="hibernate4AnnotatedSessionFactory" />
        </beans:bean>
        <beans:bean id="personService"
            class="com.myproject.shop.spring.service.PersonServiceImpl">
            <beans:property name="personDAO" ref="personDAO"></beans:property>
        </beans:bean>
        <context:component-scan
            base-package="com.myproject.shop.spring" />

        <tx:annotation-driven
            transaction-manager="transactionManager" />

        <beans:bean id="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <beans:property name="sessionFactory"
                ref="hibernate4AnnotatedSessionFactory" />
        </beans:bean>

    </beans:beans>

我成功构建并部署到 Tomca9 。结果在Tomcat中:

apache-tomcat-9.0.16\webapps\shop\WEB-INF\classes\shop.db

我的数据库文件。好的。

但是当我尝试从我的数据库中获取数据时,例如:

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.myproject.shop.spring.model.Person;

@Repository
public class PersonDAOImpl implements PersonDAO {

    private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class);

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf) {
        this.sessionFactory = sf;

  @SuppressWarnings("unchecked")
    public List<Person> listPersons() {
        Session session = this.sessionFactory.getCurrentSession();
        List<Person> personsList = session.createCriteria(Person.class).list();
        for (Person p : personsList) {
            logger.info("Person List::" + p);
        }
        return personsList;
    }

我在tomcat中收到错误:

`DEBUG: 11.12.2019 11:54:35.009` org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:984)
    Could not complete request
org.hibernate.exception.GenericJDBCException: could not prepare statement
        at org.hibernate.dialect.SQLiteSQLExceptionConversionDelegate.convert(SQLiteSQLExceptionConversionDelegate.java:48)
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1884)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1861)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
        at org.hibernate.loader.Loader.doQuery(Loader.java:909)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
        at org.hibernate.loader.Loader.doList(Loader.java:2553)
        at org.hibernate.loader.Loader.doList(Loader.java:2539)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
        at org.hibernate.loader.Loader.list(Loader.java:2364)
        at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682)
        at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
        at com.myproject.shop.spring.dao.PersonDAOImpl.listPersons(PersonDAOImpl.java:39)
        at ru.otus.sd.shop.spring.service.PersonServiceImpl.listPersons(PersonServiceImpl.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

            at java.lang.Thread.run(Thread.java:748)
    Caused by: org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: person)
            at org.sqlite.core.DB.newSQLException(DB.java:941)
            at org.sqlite.core.DB.newSQLException(DB.java:953)
            at org.sqlite.core.DB.throwex(DB.java:918)
            at org.sqlite.core.NativeDB.prepare_utf8(Native Method)
            at org.sqlite.core.NativeDB.prepare(NativeDB.java:134)
            at org.sqlite.core.DB.prepare(DB.java:257)
            at org.sqlite.core.CorePreparedStatement.<init>(CorePreparedStatement.java:47)
            at org.sqlite.jdbc3.JDBC3PreparedStatement.<init>(JDBC3PreparedStatement.java:30)
            at org.sqlite.jdbc4.JDBC4PreparedStatement.<init>(JDBC4PreparedStatement.java:19)
            at org.sqlite.jdbc4.JDBC4Connection.prepareStatement(JDBC4Connection.java:35)
            at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:241)
            at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:205)
            at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
            at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
            at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162)
            at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186)

PS如果我使用绝对路径它工作正常:

<beans:property name="url" value="jdbc:sqlite:d:/Programs/apache-tomcat-9.0.16/webapps/shop/WEB-INF/classes/shop.db" />

但我需要使用相对路径。

标签: javasqlitetomcat9

解决方案


推荐阅读