# Boolean: true=0 false=1 ?



## Vatar (14. März 2007)

Hi

Ich nutze zur Zeit Apache Derby als DB und Hibernate als OR-Mapping-Framework. In einer meiner Tabellen wird ein boolean gesetzt. Dann habe ich die DB mit Testdaten gefüllt und bin davon ausgegangen dass ein Boolean für 0=falsch und 1=wahr setzt. In meiner Anwendung habe ich dann mit obj.isFinished() aber genau das gegenteilige Ergebnis erhalten.

Ist es möglich das jeder seine Boolean-Implementierung macht wie er will?


----------



## tobias_petry (14. März 2007)

Eigentlich ist das so im Grunde festgelegt, hmm, sicher, dass du keinen Fehler in der Anwendung hast ?


----------



## Vatar (14. März 2007)

tobias_petry hat gesagt.:


> Eigentlich ist das so im Grunde festgelegt, hmm, sicher, dass du keinen Fehler in der Anwendung hast ?



Naja, die Objekte generiert Hibernate ja für mich und das sollte eigentlich in so einem (doch recht simplen) Fall keinen Fehler machen.


----------



## Thomas Darimont (14. März 2007)

Hallo,

wie boolean in der Datenbank abgebildet werden hängt von dem verwendeten Datenbank Dialekt ab... 

Aber mit int sollte es gehen... folgendes funktioniert bei mir:

```
/**
 * 
 */
package de.tutorials;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author Tom
 */
public class DerbyEmbeddedDatabaseExample {

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception {
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
    Properties properties = new Properties();
    properties.put("user", "user1");
    properties.put("password", "user1");
    Connection connection = DriverManager.getConnection("jdbc:derby:c:/TEMP/tutorialsDB;create=true", properties);

    createTableTestIfItDoesntExistYet(connection);
    populateTableTestIfItHasNotBeenPopulatedYet(connection);
    showContentsOfTableTest(connection);
    
    connection.close();
  }

  /**
   * @param connection
   * @throws SQLException
   */
  private static void showContentsOfTableTest(Connection connection) throws SQLException {
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT * FROM test");
    int columnCnt = resultSet.getMetaData().getColumnCount();
    boolean shouldCreateTable = true;
    while (resultSet.next() && shouldCreateTable) {
      for(int i = 1; i <= columnCnt;i++){
        System.out.print(resultSet.getString(i) +  " ");
      }
      System.out.println();
    }
    resultSet.close();
    statement.close();
  }

  private static void populateTableTestIfItHasNotBeenPopulatedYet(Connection connection) throws Exception {

    boolean shouldPopulateTable = true;
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT COUNT(*) FROM test");
    if (resultSet.next()) {
      shouldPopulateTable = resultSet.getInt(1) == 0;
    }
    resultSet.close();
    statement.close();

    if (shouldPopulateTable) {
      System.out.println("Populating Table test...");
      PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test VALUES (?,?,?)");
      String[] data = { "AAA", "BBB", "CCC", "DDD", "EEE" };
      for (int i = 0; i < data.length; i++) {
        preparedStatement.setInt(1, i);
        preparedStatement.setString(2, data[i]);
        preparedStatement.setBoolean(3, i % 2 == 0);
        preparedStatement.execute();
      }
      preparedStatement.close();
    }
  }


  private static void createTableTestIfItDoesntExistYet(Connection connection) throws Exception {
    ResultSet resultSet = connection.getMetaData().getTables("%", "%", "%", new String[] { "TABLE" });
    int columnCnt = resultSet.getMetaData().getColumnCount();
    boolean shouldCreateTable = true;
    while (resultSet.next() && shouldCreateTable) {
      if (resultSet.getString("TABLE_NAME").equalsIgnoreCase("TEST")) {
        shouldCreateTable = false;
      }
    }
    resultSet.close();
    if (shouldCreateTable) {
      System.out.println("Creating Table test...");
      Statement statement = connection.createStatement();
      statement.execute("create table test (id int not null, data varchar(32), b int)");
      statement.close();
    }
  }
}
```

Ausgabe:

```
Creating Table test...
Populating Table test...
0 AAA 1 
1 BBB 0 
2 CCC 1 
3 DDD 0 
4 EEE 1
```

Bei diesem Standard JDBC Beispiel ist true = 1 und false = 0... sollte bei Hibernate dann genauso sein, schließlich verwendet Hibernate unter der Haube auch JDBC...

Gruß Tom


----------

