Skip to content
This repository has been archived by the owner on Nov 23, 2021. It is now read-only.

#671: add support for hana as dbType #671

Merged
merged 3 commits into from
Sep 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>1.5.4</version>
#elseif ($dbType == 'hana')
<groupId>com.sap.cloud.db.jdbc</groupId>
<artifactId>ngdbc</artifactId>
<version>2.3.48</version>
#elseif ($dbType == 'oracle')
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ spring.jpa.hibernate.ddl-auto=validate
# https://github.com/spring-projects/spring-boot/blob/d3c34ee3d1bfd3db4a98678c524e145ef9bca51c/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java
#if ($dbType == 'mariadb')
spring.jpa.database=mysql
#elseif ($dbType == 'hana')
# Requires spring 5.1 - see https://jira.spring.io/browse/SPR-16460
#spring.jpa.database=hana
spring.jpa.database=default
#else
spring.jpa.database=${dbType}
#end
Expand All @@ -39,6 +43,10 @@ spring.datasource.username=${rootArtifactId}
# spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
# spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=${rootArtifactId}
#elseif ($dbType == 'hana')
Copy link
Contributor

@AbhayChandel AbhayChandel Aug 30, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Property spring.jpa.database is set to hana, which is not a valid value. As of now hana database cannot be set explicitly using this property. So from the list of available values only DEFAULT seems to be a sensible choice and using it Hibernate is able to resolve the database correctly. So it is better to set this property to DEFAULT

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting HANA via spring.jpa.database will be possible starting with Spring 5.1 (see Jira item https://jira.spring.io/browse/SPR-16460)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for all your valuable feedback. Also great seeing how hana evolves and becomes first class citizen by all frameworks 👍
With this information, I would suggest not to change anything. We just leave it like this and it will get fixed in the future when the update to spring 5.1 takes place.

Copy link
Contributor

@AbhayChandel AbhayChandel Aug 31, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hohwille but with the current setting application fails to startup. So until Spring 5.1 is available we need to provide a valid value that works for Hana.

# spring.jpa.database-platform=org.hibernate.dialect.HANAColumnStoreDialect
# spring.datasource.driver-class-name=com.sap.db.jdbc.Driver
spring.datasource.username=${rootArtifactId}
#elseif ($dbType == 'oracle')
# spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
# spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ spring.datasource.url=jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3
#elseif ($dbType == 'mariadb')
spring.datasource.password=todo
spring.datasource.url=jdbc:mariadb://localhost:3306/db
#elseif ($dbType == 'hana')
spring.datasource.password=todo
# https://help.sap.com/viewer/0eec0d68141541d1b07893a39944924e/latest/en-US/b250e7fef8614ea0a0973d58eb73bda8.html
spring.datasource.url=jdbc:sap://localhost:39015
#elseif ($dbType == 'oracle')
spring.datasource.password=todo
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- Leave a large ID space reserved for master-data and test-data
CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000;

-- hana does not support Dateadd function out of the box so we add it here to be able to use it for master-data SQLs
CREATE FUNCTION DATEADD(IN DATETYPE NVARCHAR(256), IN NUMBER INTEGER, IN TS TIMESTAMP)
RETURNS TSADD TIMESTAMP
AS
BEGIN
IF :DATETYPE = 'DAY'
THEN
TSADD = ADD_DAYS(:TS, :NUMBER);
ELSEIF :DATETYPE = 'HOUR'
THEN
TSADD = ADD_SECONDS(:TS, :NUMBER * 3600);
ELSE
SIGNAL SQL_ERROR_CODE 10000 SET MESSAGE_TEXT = 'Unsupported date type: ' || :DATETYPE;
END IF;
END;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- *** RevInfo (Commit log for envers audit trail) ***
CREATE COLUMN TABLE RevInfo(
id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
"timestamp" BIGINT NOT NULL,
Copy link

@breglerj breglerj Aug 17, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unquoted columns will be upper-cased while quoted columns will be mixed-case. So for consistency reasons you should name this column "TIMESTAMP".

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason here is that we had to quote this property also in the JPA annotation as this is a reserved keyword in Oracle.
https://github.com/oasp/oasp4j/blob/develop/modules/jpa-basic/src/main/java/io/oasp/module/jpa/dataaccess/api/AdvancedRevisionEntity.java#L41

For some reasons (case-sensitivity) in DDL for most databases this property then also has to be quoted in the same way. To keep this consistent we do it the same way for the DDLs of all database types.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW: Using "TIMESTAMP" in AdvancedRevisionEntity.java would indeed have been the better option for 2.6.x. Changing this again? Or leave it as is?

userLogin VARCHAR(255),
PRIMARY KEY (ID)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- *** BinaryObject (BLOBs) ***
CREATE COLUMN TABLE BinaryObject (
id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
modificationCounter INTEGER NOT NULL,
content BLOB,
filesize BIGINT NOT NULL,
mimeType VARCHAR(255),
CONSTRAINT PK_BinaryObject_id PRIMARY KEY(ID)
);