Стол дерби не создается

Я пытаюсь создать базу данных и таблицу из своего кода Java безрезультатно. Вот мой код базы данных и ошибка, которую я получаю при запуске своей программы. Когда я отлаживаю, мои переменные PreparedStatement равны нулю.

public class RecordDao {

/** Creates a new instance of RecordDao */
public RecordDao() {
    this("Requirements");
}

public RecordDao(String requirements) {
    this.dbName = requirements;

    setDBSystemDir();
    dbProperties = loadDBProperties();
    String driverName = dbProperties.getProperty("derby.driver"); 
    loadDatabaseDriver(driverName);
    if(!dbExists()) {
        createDatabase();
    }

}

private boolean dbExists() {
    boolean bExists = false;
    String dbLocation = getDatabaseLocation();
    File dbFileDir = new File(dbLocation);
    if (dbFileDir.exists()) {
        bExists = true;
    }
    return bExists;
}

private void setDBSystemDir() {
    // decide on the db system directory
    String userHomeDir = System.getProperty("user.home", ".");
    String systemDir = userHomeDir + "/.requirementsspecs";
    System.setProperty("derby.system.home", systemDir);

    // create the db system directory
    File fileSystemDir = new File(systemDir);
    fileSystemDir.mkdir();
}

private void loadDatabaseDriver(String driverName) {
    // load Derby driver
    try {
        Class.forName(driverName);
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

}

private Properties loadDBProperties() {
    InputStream dbPropInputStream = null;
    dbPropInputStream = RecordDao.class.getResourceAsStream("Configuration.properties");
    dbProperties = new Properties();
    try {
        dbProperties.load(dbPropInputStream);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return dbProperties;
}


private boolean createTables(Connection dbConnection) {
    boolean bCreatedTables = false;
    Statement statement = null;
    try {
        statement = dbConnection.createStatement();
        statement.execute(strCreateRequirementsTable);
        bCreatedTables = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

    return bCreatedTables;
}
private boolean createDatabase() {
    boolean bCreated = false;
    Connection dbConnection = null;

    String dbUrl = getDatabaseUrl();
    dbProperties.put("create", "true");

    try {
        System.out.println("inside try statement to create database");
        dbConnection = DriverManager.getConnection(dbUrl, dbProperties);
        bCreated = createTables(dbConnection);
    } catch (SQLException ex) {
    }
    dbProperties.remove("create");
    return bCreated;
}


public boolean connect() {
    String dbUrl = getDatabaseUrl();
    try {
        dbConnection = DriverManager.getConnection(dbUrl, dbProperties);
        stmtSaveNewRecord = dbConnection.prepareStatement(strSaveRecord, Statement.RETURN_GENERATED_KEYS);
        stmtUpdateExistingRecord = dbConnection.prepareStatement(strUpdateRecord);
        stmtGetRecord = dbConnection.prepareStatement(strGetRecord);
        stmtDeleteRecord = dbConnection.prepareStatement(strDeleteRecord);

        isConnected = dbConnection != null;
    } catch (SQLException ex) {
        isConnected = false;
    }
    return isConnected;
}

private String getHomeDir() {
    return System.getProperty("user.home");
}

public void disconnect() {
    if(isConnected) {
        String dbUrl = getDatabaseUrl();
        dbProperties.put("shutdown", "true");
        try {
            DriverManager.getConnection(dbUrl, dbProperties);
        } catch (SQLException ex) {
        }
        isConnected = false;
    }
}

public String getDatabaseLocation() {
    String dbLocation = System.getProperty("derby.system.home") + "/" + dbName;
    return dbLocation;
}

public String getDatabaseUrl() {
    String dbUrl = dbProperties.getProperty("derby.url") + dbName;
    return dbUrl;
}


public int saveRecord(RequirementsData record) {
    int id = -1;
    try {
        stmtSaveNewRecord.clearParameters();
        stmtSaveNewRecord.setString(1, record.getDescription());
        stmtSaveNewRecord.setString(2, record.getType());
        stmtSaveNewRecord.setString(3, record.getStatus());
        stmtSaveNewRecord.setString(4, record.getPriority());
        stmtSaveNewRecord.setString(5, record.getDifficulty());
        stmtSaveNewRecord.setString(6, record.getDueDate());
        stmtSaveNewRecord.setString(7, record.getCreatedOn());
        int rowCount = stmtSaveNewRecord.executeUpdate();
        ResultSet results = stmtSaveNewRecord.getGeneratedKeys();
        if (results.next()) {
            id = results.getInt(1);
        }

    } catch(SQLException sqle) {
        sqle.printStackTrace();
    }
    return id;
}

public boolean editRecord(RequirementsData record) {
    boolean bEdited = false;
    try {
        stmtUpdateExistingRecord.clearParameters();

        stmtUpdateExistingRecord.setString(1, record.getDescription());
        stmtUpdateExistingRecord.setString(2, record.getType());
        stmtUpdateExistingRecord.setString(3, record.getStatus());
        stmtUpdateExistingRecord.setString(4, record.getPriority());
        stmtUpdateExistingRecord.setString(5, record.getDifficulty());
        stmtUpdateExistingRecord.setString(6, record.getDueDate());
        stmtUpdateExistingRecord.setString(7, record.getCreatedOn());
        stmtUpdateExistingRecord.setInt(12, record.getId());
        stmtUpdateExistingRecord.executeUpdate();
        bEdited = true;
    } catch(SQLException sqle) {
        sqle.printStackTrace();
    }
    return bEdited;

}

public boolean deleteRecord(int id) {
    boolean bDeleted = false;
    try {
        stmtDeleteRecord.clearParameters();
        stmtDeleteRecord.setInt(1, id);
        stmtDeleteRecord.executeUpdate();
        bDeleted = true;
    } catch (SQLException sqle) {
        sqle.printStackTrace();
    }

    return bDeleted;
}

public boolean deleteRecord(RequirementsData record) {
    int id = record.getId();
    return deleteRecord(id);
}

public List<ListEntry> getListEntries() {
    List<ListEntry> listEntries = new ArrayList<ListEntry>();
    Statement queryStatement = null;
    ResultSet results = null;

    try {
        queryStatement = dbConnection.createStatement();
        results = queryStatement.executeQuery(strGetListEntries);
        while(results.next()) {
            int id = results.getInt(1);
            String description = results.getString(2);
            String type = results.getString(3);
            String dueDate = results.getString(4);

            ListEntry entry = new ListEntry(description, type, dueDate, id);
            listEntries.add(entry);
        }

    } catch (SQLException sqle) {
        sqle.printStackTrace();

    }

    return listEntries;
}

public RequirementsData getRecord(int index) {
    RequirementsData record = null;
    try {
        stmtGetRecord.clearParameters();
        stmtGetRecord.setInt(1, index);
        ResultSet result = stmtGetRecord.executeQuery();
        if (result.next()) {
            String description = result.getString("DESCRIPTION");
            String type = result.getString("TYPE");
            String status = result.getString("STATUS");
            String priority = result.getString("PRIORITY");
            String difficulty = result.getString("DIFFICULTY");
            String dueDate = result.getString("DUEDATE");
            String createdOn = result.getString("CREATEDON");
            int id = result.getInt("ID");
            record = new RequirementsData(description, type, status, priority,
                    difficulty, dueDate, createdOn, id);
        }
    } catch(SQLException sqle) {
        sqle.printStackTrace();
    }

    return record;
}

public static void main(String[] args) {
    RecordDao db = new RecordDao();
    System.out.println("######"+ db.getDatabaseLocation());
    System.out.println(db.getDatabaseUrl());
    db.connect();
    db.disconnect();
}


private Connection dbConnection;
private Properties dbProperties;
private boolean isConnected;
private String dbName;
private PreparedStatement stmtSaveNewRecord;
private PreparedStatement stmtUpdateExistingRecord;
private PreparedStatement stmtGetListEntries;
private PreparedStatement stmtGetRecord;
private PreparedStatement stmtDeleteRecord;

private static final String strCreateRequirementsTable =
        "create table APP.REQUIREMENTS (" +
        "    ID             INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," +
        "    DESCRIPTION    VARCHAR(300), " +
        "    TYPE           VARCHAR(15), " +
        "    STATUS         VARCHAR(15), " +
        "    PRIORITY       VARCHAR(15), " +
        "    DIFFICULTY     VARCHAR(15), " +
        "    DUEDATE        VARCHAR(30), " +
        "    CREATEDON      VARCHAR(30), " +
        ")";

private static final String strGetRecord =
        "SELECT * FROM APP.REQUIREMENTS " +
        "WHERE ID = ?";

private static final String strSaveRecord =
        "INSERT INTO APP.REQUIREMENTS " +
        "   (DESCRIPTION, TYPE, STATUS, PRIORITY, DIFFICULTY, DUEDATE, CREATEDON) " +
        "VALUES (?, ?, ?, ?, ?, ?, ?)";


private static final String strGetListEntries =
        "SELECT ID, DESCRIPTION, TYPE, DUEDATE FROM APP.REQUIREMENTS "  +
        "ORDER BY DUEDATE ASC";

private static final String strUpdateRecord =
        "UPDATE APP.REQUIREMENTS " +
        "SET DESCRIPTION = ?, " +
        "    TYPE = ?, " +
        "    STATUS = ?, " +
        "    PRIORITY = ?, " +
        "    DIFFICULTY = ?, " +
        "    DUEDATE = ?, " +
        "    CREATEDON = ?, " +
        "WHERE ID = ?";

private static final String strDeleteRecord =
        "DELETE FROM APP.REQUIREMENTS " +
        "WHERE ID = ?";

}

Вот ошибка:

запустить: java.sql.SQLSyntaxErrorException: таблица/представление «APP.REQUIREMENTS» не существует. в org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException (неизвестный источник) в org.apache.derby.impl.jdbc.Util.generateCsSQLException (неизвестный источник) в org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException (Неизвестный источник) в org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Неизвестный источник) в org.apache.derby.impl.jdbc.EmbedConnection.handleException(Неизвестный источник) в org.apache.derby.impl.jdbc .ConnectionChild.handleException(неизвестный источник) в org.apache.derby.impl.jdbc.EmbedStatement.execute(неизвестный источник) в org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(неизвестный источник) в com.example.requirements .db.RecordDao.getListEntries(RecordDao.java:240) в com.example.requirements.RequirementsFrame.(RequirementsFrame.java:42) в com.example.requirements.RequirementsFrame.main(RequirementsFrame.java:182) Вызвано: java .sql.SQLException: вкладка le/View 'APP.REQUIREMENTS' не существует. в org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException (неизвестный источник) в org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA (неизвестный источник) ... еще 11 Вызвано: ОШИБКА 42X05: таблица/представление APP.REQUIREMENTS не существует. в org.apache.derby.iapi.error.StandardException.newException(неизвестный источник) в org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(неизвестный источник) в org.apache.derby.impl.sql.compile .FromBaseTable.bindNonVTITables(неизвестный источник) в org.apache.derby.impl.sql.compile.FromList.bindTables(неизвестный источник) в org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(неизвестный источник) в org. .apache.derby.impl.sql.compile.DMLStatementNode.bindTables(неизвестный источник) в org.apache.derby.impl.sql.compile.DMLStatementNode.bind(неизвестный источник) в org.apache.derby.impl.sql.compile .CursorNode.bindStatement(неизвестный источник) в org.apache.derby.impl.sql.GenericStatement.prepMinion(неизвестный источник) в org.apache.derby.impl.sql.GenericStatement.prepare(неизвестный источник) в org.apache.derby .impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement (неизвестный источник) .. , еще 5

Есть идеи, что происходит? В моих библиотеках есть derby.jar.


person taraloca    schedule 23.11.2010    source источник


Ответы (4)


Ваш код говорит: «Если ! dbExists, то createDatabase». Возможно, dbExists возвращает TRUE, когда у вас есть новая пустая база данных, и поэтому вы не вызываете createDatabase и, следовательно, не вызываете createTables.

person Bryan Pendleton    schedule 23.11.2010

Как выглядит ваш URL-адрес базы данных? В конце должно быть ";create=true"...

Кстати, рассмотрите возможность использования JPA вместо простого JDBC

person Puce    schedule 23.11.2010
comment
Я бы не рекомендовал JPA никому, кто еще не освоил JDBC. - person duffymo; 25.11.2010
comment
Ну, сначала изучите JDBC, затем JPA, затем работайте над реальным проектом, используя JPA ;-) - person Puce; 25.11.2010

Пример кода не кажется полным, сбой происходит в getListEntries, но он никогда не вызывается в приведенном выше коде.

person aronp    schedule 23.11.2010

Вы делаете действительно ужасные вещи с блоками catch. Вы должны отредактировать каждый, чтобы все они печатали или регистрировали трассировку стека. Пустой блок catch означает, что может быть сгенерировано исключение, но вы об этом никогда не узнаете.

Как вы думаете, зачем вам нужно создавать таблицы в коде Java? В большинстве приложений схема разрабатывается и реализуется администратором баз данных, поэтому она уже используется, когда приложение Java запускается. Почему вы должны создавать таблицы во время выполнения? Следует сделать один раз.

person duffymo    schedule 23.11.2010
comment
Я делаю проект класса, где у меня нет доступа к серверу, поэтому я должен использовать встроенную базу данных (Derby) в своей программе. Кроме того, код, который у меня есть, является частью примера, полученного от Sun. - person taraloca; 25.11.2010