PageRenderTime 55ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/hibernate-core/src/main/java/org/hibernate/dialect/Database.java

https://github.com/maesenka/hibernate-core
Java | 335 lines | 267 code | 25 blank | 43 comment | 15 complexity | 9b019c8a795ea106704068066467049c MD5 | raw file
  1. /*
  2. * Hibernate, Relational Persistence for Idiomatic Java
  3. *
  4. * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  5. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  6. */
  7. package org.hibernate.dialect;
  8. import java.sql.DatabaseMetaData;
  9. import java.sql.ResultSet;
  10. import java.sql.SQLException;
  11. import java.sql.Statement;
  12. import org.hibernate.engine.jdbc.dialect.spi.BasicSQLExceptionConverter;
  13. import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
  14. /**
  15. * A list of relational database systems for which Hibernate can resolve a {@link Dialect}.
  16. *
  17. * However, Hibernate can work with other database systems that are not listed by the {@link Database}
  18. * enumeration, as long as a {@link Dialect} implementation class is provided via the {@code hibernate.dialect}
  19. * configuration property.
  20. *
  21. * @author Vlad Mihalcea
  22. */
  23. public enum Database {
  24. DB2 {
  25. @Override
  26. public Dialect createDialect(DialectResolutionInfo info) {
  27. String databaseVersion = info.getDatabaseVersion();
  28. if ( databaseVersion != null ) {
  29. //See https://www.ibm.com/support/knowledgecenter/SSEPEK_12.0.0/java/src/tpc/imjcc_c0053013.html
  30. switch ( databaseVersion.substring( 0, 3 ) ) {
  31. case "SQL": {
  32. // Linux, UNIX, Windows
  33. return new DB2Dialect( info );
  34. }
  35. case "DSN": {
  36. // z/OS
  37. return new DB2zDialect( info );
  38. }
  39. case "QSQ": {
  40. // i
  41. return new DB2iDialect( info );
  42. }
  43. }
  44. }
  45. return new DB2Dialect( info );
  46. }
  47. @Override
  48. public boolean productNameMatches(String databaseName) {
  49. return databaseName.startsWith( "DB2" );
  50. }
  51. @Override
  52. public String getDriverClassName(String jdbcUrl) {
  53. return "com.ibm.db2.jcc.DB2Driver";
  54. }
  55. },
  56. DERBY {
  57. @Override
  58. public Dialect createDialect(DialectResolutionInfo info) {
  59. return new DerbyDialect( info );
  60. }
  61. @Override
  62. public boolean productNameMatches(String databaseName) {
  63. return "Apache Derby".equals( databaseName );
  64. }
  65. @Override
  66. public String getDriverClassName(String jdbcUrl) {
  67. return jdbcUrl.startsWith( "jdbc:derby://" )
  68. ? "org.apache.derby.jdbc.ClientDriver"
  69. : "org.apache.derby.jdbc.EmbeddedDriver";
  70. }
  71. },
  72. ENTERPRISEDB {
  73. @Override
  74. public Dialect createDialect(DialectResolutionInfo info) {
  75. return new PostgresPlusDialect( info );
  76. }
  77. @Override
  78. public boolean productNameMatches(String databaseName) {
  79. return "EnterpriseDB".equals( databaseName );
  80. }
  81. @Override
  82. public String getDriverClassName(String jdbcUrl) {
  83. return "com.edb.Driver";
  84. }
  85. @Override
  86. public String getUrlPrefix() {
  87. return "jdbc:edb:";
  88. }
  89. },
  90. H2 {
  91. @Override
  92. public Dialect createDialect(DialectResolutionInfo info) {
  93. return new H2Dialect( info );
  94. }
  95. @Override
  96. public boolean productNameMatches(String databaseName) {
  97. return "H2".equals( databaseName );
  98. }
  99. @Override
  100. public String getDriverClassName(String jdbcUrl) {
  101. return "org.h2.Driver";
  102. }
  103. },
  104. HSQL {
  105. @Override
  106. public Dialect createDialect(DialectResolutionInfo info) {
  107. return new HSQLDialect( info );
  108. }
  109. @Override
  110. public boolean productNameMatches(String databaseName) {
  111. return "HSQL Database Engine".equals( databaseName );
  112. }
  113. @Override
  114. public String getDriverClassName(String jdbcUrl) {
  115. return "org.hsqldb.jdbc.JDBCDriver";
  116. }
  117. @Override
  118. public String getUrlPrefix() {
  119. return "jdbc:hsqldb:";
  120. }
  121. },
  122. HANA {
  123. @Override
  124. public Dialect createDialect(DialectResolutionInfo info) {
  125. return new HANAColumnStoreDialect( info );
  126. }
  127. @Override
  128. public boolean productNameMatches(String databaseName) {
  129. return "HDB".equals( databaseName );
  130. }
  131. @Override
  132. public String getDriverClassName(String jdbcUrl) {
  133. return "com.sap.db.jdbc.Driver";
  134. }
  135. @Override
  136. public String getUrlPrefix() {
  137. return "jdbc:sap:";
  138. }
  139. },
  140. MARIADB {
  141. @Override
  142. public boolean matchesResolutionInfo(DialectResolutionInfo info) {
  143. if ( productNameMatches( info.getDatabaseName() ) ) {
  144. return true;
  145. }
  146. else {
  147. //in case the product name has been set to MySQL
  148. String driverName = info.getDriverName();
  149. return driverName != null && driverName.startsWith( "MariaDB" );
  150. }
  151. }
  152. @Override
  153. public Dialect createDialect(DialectResolutionInfo info) {
  154. return new MariaDBDialect( info );
  155. }
  156. @Override
  157. public boolean productNameMatches(String productName) {
  158. return "MariaDB".equals( productName );
  159. }
  160. @Override
  161. public String getDriverClassName(String jdbcUrl) {
  162. return "org.mariadb.jdbc.Driver";
  163. }
  164. },
  165. MYSQL {
  166. @Override
  167. public Dialect createDialect(DialectResolutionInfo info) {
  168. return new MySQLDialect( info );
  169. }
  170. @Override
  171. public boolean productNameMatches(String databaseName) {
  172. return "MySQL".equals( databaseName );
  173. }
  174. @Override
  175. public String getDriverClassName(String jdbcUrl) {
  176. return "com.mysql.cj.jdbc.Driver";
  177. }
  178. },
  179. ORACLE {
  180. @Override
  181. public Dialect createDialect(DialectResolutionInfo info) {
  182. return new OracleDialect( info );
  183. }
  184. @Override
  185. public boolean productNameMatches(String databaseName) {
  186. return "Oracle".equals( databaseName );
  187. }
  188. /*@Override
  189. public String getDriverClassName() {
  190. return "oracle.jdbc.OracleDriver";
  191. }*/
  192. },
  193. POSTGRESQL {
  194. @Override
  195. public Dialect createDialect(DialectResolutionInfo info) {
  196. final String version = getVersion( info.getDatabaseMetadata() );
  197. if ( version.startsWith( "Cockroach" ) ) {
  198. return new CockroachDialect( info );
  199. }
  200. return new PostgreSQLDialect( info );
  201. }
  202. @Override
  203. public boolean productNameMatches(String databaseName) {
  204. return "PostgreSQL".equals( databaseName );
  205. }
  206. @Override
  207. public String getDriverClassName(String jdbcUrl) {
  208. return "org.postgresql.Driver";
  209. }
  210. private String getVersion(DatabaseMetaData databaseMetaData) {
  211. if ( databaseMetaData != null ) {
  212. try ( Statement statement = databaseMetaData.getConnection().createStatement() ) {
  213. final ResultSet rs = statement.executeQuery( "select version()" );
  214. if ( rs.next() ) {
  215. return rs.getString( 1 );
  216. }
  217. }
  218. catch (SQLException e) {
  219. throw BasicSQLExceptionConverter.INSTANCE.convert( e );
  220. }
  221. }
  222. return "";
  223. }
  224. },
  225. SPANNER {
  226. @Override
  227. public Dialect createDialect(DialectResolutionInfo info) {
  228. return new SpannerDialect( info );
  229. }
  230. @Override
  231. public boolean productNameMatches(String databaseName) {
  232. return databaseName.startsWith( "Google Cloud Spanner" );
  233. }
  234. @Override
  235. public String getDriverClassName(String jdbcUrl) {
  236. return "com.google.cloud.spanner.jdbc.JdbcDriver";
  237. }
  238. },
  239. SQLSERVER {
  240. @Override
  241. public Dialect createDialect(DialectResolutionInfo info) {
  242. return new SQLServerDialect( info );
  243. }
  244. @Override
  245. public boolean productNameMatches(String databaseName) {
  246. return databaseName.startsWith( "Microsoft SQL Server" );
  247. }
  248. @Override
  249. public String getDriverClassName(String jdbcUrl) {
  250. return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  251. }
  252. },
  253. SYBASE {
  254. @Override
  255. public Dialect createDialect(DialectResolutionInfo info) {
  256. final String databaseName = info.getDatabaseName();
  257. if ( isASE( databaseName ) ) {
  258. return new SybaseASEDialect( info );
  259. }
  260. return null;
  261. }
  262. private boolean isASE(String databaseName) {
  263. return "Sybase SQL Server".equals( databaseName )
  264. || "Adaptive Server Enterprise".equals( databaseName )
  265. || "ASE".equals( databaseName );
  266. }
  267. @Override
  268. public boolean productNameMatches(String productName) {
  269. return isASE( productName );
  270. }
  271. @Override
  272. public boolean matchesUrl(String jdbcUrl) {
  273. return jdbcUrl.startsWith( "jdbc:sybase:" )
  274. || jdbcUrl.startsWith( "jdbc:sqlanywhere:" );
  275. }
  276. };
  277. /**
  278. * Does this database match the given metadata?
  279. */
  280. public boolean matchesResolutionInfo(DialectResolutionInfo info) {
  281. return productNameMatches( info.getDatabaseName() );
  282. }
  283. /**
  284. * Does this database have the given product name?
  285. */
  286. public abstract boolean productNameMatches(String productName);
  287. /**
  288. * Create a {@link Dialect} for the given metadata.
  289. */
  290. public abstract Dialect createDialect(DialectResolutionInfo info);
  291. /**
  292. * Get the name of the JDBC driver class for this database,
  293. * or null if we're not too sure what it should be.
  294. */
  295. public String getDriverClassName(String jdbcUrl) {
  296. return null;
  297. }
  298. /**
  299. * Get the JDBC URL prefix used by this database.
  300. */
  301. public String getUrlPrefix() {
  302. return "jdbc:" + toString().toLowerCase() + ":";
  303. }
  304. /**
  305. * Does the given JDBC URL connect to this database?
  306. */
  307. public boolean matchesUrl(String jdbcUrl) {
  308. return jdbcUrl.toLowerCase().startsWith( getUrlPrefix() );
  309. }
  310. }