Q:

Как организовать хранение файлов БД в файловой структуре Веб-приложения

Всем доброго времени суток!
Я разрабатываю веб-приложение с использованием Spring, Spring Security, Hibernate, СУБД = HSQLDB. Файлы БД должны храниться в одной из папок в файловой структуре приложения после его развертки на целевом локальном ПК (работает на localhost:8080, если это важно).
Сейчас я столкнулся с проблемой того, что Hibernate не может получить доступ к файлам БД и при любом получении данных о сущности User из БД выдает выдает следующее исключение (только самая важная часть)
org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1927)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1896)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1874)
    at org.hibernate.loader.Loader.doQuery(Loader.java:919)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
    at org.hibernate.loader.Loader.doList(Loader.java:2610)
    at org.hibernate.loader.Loader.doList(Loader.java:2593)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422)
    at org.hibernate.loader.Loader.list(Loader.java:2417)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
    at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:964)
    at com.dvdexchange.dao.impl.UserDAOHibernateImpl.getUserByEmail(UserDAOHibernateImpl.java:77)

Конкретно Hibernate выдает еще и следующие важные строки
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: USER
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ParserDQL.readTableName(Unknown Source)
    at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
    at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
    at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
    at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 99 common frames omitted

Говоря конкретно о месте возникновения ошибки в java коде вот этот метод:
 public User getUserByEmail(String email) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        User resultUser = null;
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            String hql = "FROM User U " +
                    "WHERE U.email=:user_email";
            Query query = session.createQuery(hql);
            query.setParameter("user_email", email);
            resultUser = (User) query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
        return resultUser;
    }

а именно 11 строка resultUser = (User) query.uniqueResult(); именно при получении пользователя Hibernate выдает далее исключение о том что пользователя нет в БД а затем уже NullPointerException далее по коду по понятным причинам.
Я храню файлы БД в папке DBStorage внутри каталога recources:

Соответственно в Hibernate.cfg.xml настройки сессии заданы так (внимание на URL):
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:file:src/resources/DBStorage/testdb</property>
        <property name="connection.username">SA</property>
        <property name="connection.password"></property>

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

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.HSQLDialect</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">create</property>-->

        <!-- Mapping files -->
        <mapping resource="User.hbm.xml"/>
        <mapping resource="Disk.hbm.xml"/>
        <mapping resource="Takenitem.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

На ранних этапах разработки приложения я работал над правильным взаимодействием между приложением и БД через Hibernate и проверял правильность работы запросов в методах классов слоя доступа к данным (DAO). Сервер Jetty я тогда еще не использовал в качестве контейнера для своего приложения, а проверял работу DAO классов через метод main. Соответственно проблема не может быть в DAO классах.  
После перехода на Jetty и удаления класса с методом main и переработки всего приложения по технологии Spring естественно многое поменялось. При компиляции артифакта структура папок на выходе уже иная и (я так думаю) url сессии в Hibernate.cfg.xml из-за этого становится неправильным, посему Hibernate не находит файлы БД. Вот структура папок артифакта после компиляции на выходе (папка out):

Возможна и еще одна причина такого поведения - это то что данные в БД каждый раз пропадают по какой-то причине, но если это так, то я не знаю как с этим справиться и даже, где "копать". Хотя  это маловероятно.
Вопросы: 
1) Как организовать хранение файлов БД в файловой структуре Веб-приложения  
2) Какие средства, кроме Flyway и ddl.auto можно использовать для автоматической генерации структуры БД и начальных данных? Я слыхал, что некий файл с расширением .script тут может помочь. Еще кто-то писал что можно воспользоваться ContextListener веб-приложения, но я не знаком с этими вещами, так что требуется помощь - желательно с примерами.
Спасибо заранее!

A:

Замени file:src/resources на classpath:. Работать может и будет, но это гиблый подход. Хотя бы потому, что сервер, при перезапуске, имеет право заново распаковать твоё приложение (war'ник), при этом удалив все старые файлы. В серверных приложениях обычно идут по пути настройки jndi.
Никакого файла с расширением .scpirt не описано в спецификациях java. 

Что касательно ContextListener. Есть несколько типов слушателей в серверных java-приложениях. Тебе нужен javax.servlet.ServletContextListener. Делаешь свой класс с реализацией данного интерфейса. В переопределённых методах пишешь нужный тебе функционал, который будет запускаться при запуске/остановке приложения. Далее добавляешь его определение в файл web.xml примерно так
<web-app>
  <listener>
    <listener-class>ru.test.MyListener</listenerclass>
  </listener>
</web-app>

либо можно пометить свой класс аннотацией javax.servlet.annotation.WebListener (нужна поддержка servlet версии 3, т.е. jetty версии 8 и старше). Собственно ты можешь делать при помощи данного класса всё, что душа пожелает, до старта приложения, в том числе и создание каркаса таблиц.

