Hibernate
maps boolean values to BOOLEAN column if the underlying database has support
for Boolean type. If any database do not have support for BOOLEAN data type,
then it use whatever is available like BIT, TINYINT or SMALLINT.
To make
the things more simple, Hibernate provides three built-in converters to handle
common Boolean mapping cases.
|
Converter
|
Description
|
|
NumericBooleanConverter
|
Map 1
for true, and 0 for false.
|
|
TrueFalseConverter
|
Map ‘T’
for true, and ‘F’ for false.
|
|
YesNoConverter
|
Map ‘Y’
for true, and ‘N’ for false.
|
Example
@Convert(converter = org.hibernate.type.YesNoConverter.class)
Boolean yesNoField;
@Convert(converter = org.hibernate.type.TrueFalseConverter.class)
Boolean trueFalseField;
@Convert(converter = org.hibernate.type.NumericBooleanConverter.class)
Boolean numericBooleanField;
Boolean implicitField;
Follow
below step-by-step procedure to build complete working application.
Step 1:
Create new maven
project ‘hibernate-boolean-type-demo’.
Step 2:
Update pom.xml with
maven dependencies.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample.app</groupId>
<artifactId>hibernate-boolean-type-demo</artifactId>
<version>1</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>15</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.4.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.2.Final</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
</project>
Step 3:
Define BooleanDemo
entity class.
BooleanDemo.java
package com.sample.app.entity;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "boolean_demo")
public class BooleanDemo {
@Id
private Integer id;
@Convert(converter = org.hibernate.type.YesNoConverter.class)
Boolean yesNoField;
@Convert(converter = org.hibernate.type.TrueFalseConverter.class)
Boolean trueFalseField;
@Convert(converter = org.hibernate.type.NumericBooleanConverter.class)
Boolean numericBooleanField;
Boolean implicitField;
public BooleanDemo(Integer id, Boolean yesNoField, Boolean trueFalseField, Boolean numericBooleanField,
Boolean implicitField) {
this.id = id;
this.yesNoField = yesNoField;
this.trueFalseField = trueFalseField;
this.numericBooleanField = numericBooleanField;
this.implicitField = implicitField;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Boolean getYesNoField() {
return yesNoField;
}
public void setYesNoField(Boolean yesNoField) {
this.yesNoField = yesNoField;
}
public Boolean getTrueFalseField() {
return trueFalseField;
}
public void setTrueFalseField(Boolean trueFalseField) {
this.trueFalseField = trueFalseField;
}
public Boolean getNumericBooleanField() {
return numericBooleanField;
}
public void setNumericBooleanField(Boolean numericBooleanField) {
this.numericBooleanField = numericBooleanField;
}
public Boolean getImplicitField() {
return implicitField;
}
public void setImplicitField(Boolean implicitField) {
this.implicitField = implicitField;
}
}
Step 4:
Create
hibernate.cfg.xml file under src/main/resources folder.
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://127.0.0.1:5432/test</property>
<property name="connection.username">postgres</property>
<property name="connection.password">postgres</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">false</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hbm2ddl.auto">update</property>
<mapping class="com.sample.app.entity.BooleanDemo" />
</session-factory>
</hibernate-configuration>
Step 5:
Define main
application class.
App.java
package com.sample.app;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import com.sample.app.entity.BooleanDemo;
public class App {
private static final SessionFactory SESSION_FACTORY = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
final StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml").build();
final Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build();
return metaData.getSessionFactoryBuilder().build();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static void main(final String args[]) {
BooleanDemo p1 = new BooleanDemo(1, true, true, true, true);
BooleanDemo p2 = new BooleanDemo(2, false, false, false, false);
try (final Session session = SESSION_FACTORY.openSession()) {
session.beginTransaction();
session.persist(p1);
session.persist(p2);
session.getTransaction().commit();
}
}
}
Total
project structure looks like below.
Run
App.java, you will see below kind of messages in the console.
Aug 16, 2022 10:01:13 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 6.1.2.Final
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using built-in connection pool (not intended for production use)
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: Loaded JDBC driver class: org.postgresql.Driver
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001012: Connecting with JDBC URL [jdbc:postgresql://127.0.0.1:5432/test]
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=postgres}
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH10001115: Connection pool size: 20 (min=1)
Aug 16, 2022 10:01:14 AM org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl logSelectedDialect
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
Aug 16, 2022 10:01:14 AM org.hibernate.metamodel.internal.EntityInstantiatorPojoStandard resolveConstructor
INFO: HHH000182: No default (no-argument) constructor for class: com.sample.app.entity.BooleanDemo (class must be instantiated by Interceptor)
Aug 16, 2022 10:01:14 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4fe64d23] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Hibernate:
create table boolean_demo (
id integer not null,
implicitField boolean,
numericBooleanField integer,
trueFalseField char(1),
yesNoField char(1),
primary key (id)
)
Aug 16, 2022 10:01:15 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
insert
into
boolean_demo
(implicitField, numericBooleanField, trueFalseField, yesNoField, id)
values
(?, ?, ?, ?, ?)
Hibernate:
insert
into
boolean_demo
(implicitField, numericBooleanField, trueFalseField, yesNoField, id)
values
(?, ?, ?, ?, ?)
Query PostgreSQL
to confirm the table structure and table content.
test=# \d
List of relations
Schema | Name | Type | Owner
public | boolean_demo | table | postgres
(1 row)
test=#
test=# \d+ boolean_demo
Table "public.boolean_demo"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
id | integer | | not null | | plain | | |
implicitfield | boolean | | | | plain | | |
numericbooleanfield | integer | | | | plain | | |
truefalsefield | character(1) | | | | extended | | |
yesnofield | character(1) | | | | extended | | |
Indexes:
"boolean_demo_pkey" PRIMARY KEY, btree (id)
Access method: heap
test=#
test=# SELECT * FROM boolean_demo;
id | implicitfield | numericbooleanfield | truefalsefield | yesnofield
1 | t | 1 | T | Y
2 | f | 0 | F | N
(2 rows)
You can
download this application from this link.
Previous
Next
Home