diff --git a/persistence-modules/hibernate-annotations/.idea/$CACHE_FILE$ b/persistence-modules/hibernate-annotations/.idea/$CACHE_FILE$
new file mode 100644
index 0000000000..0c8b793946
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/$CACHE_FILE$
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+ Android
+
+
+ CorrectnessLintAndroid
+
+
+ Java
+
+
+ Java language level migration aidsJava
+
+
+ LintAndroid
+
+
+ PerformanceLintAndroid
+
+
+
+
+ Android
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/.gitignore b/persistence-modules/hibernate-annotations/.idea/.gitignore
new file mode 100644
index 0000000000..5c98b42884
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/codeStyles/Project.xml b/persistence-modules/hibernate-annotations/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000000..6b4e7de90f
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/codeStyles/Project.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/codeStyles/codeStyleConfig.xml b/persistence-modules/hibernate-annotations/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000000..a55e7a179b
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/compiler.xml b/persistence-modules/hibernate-annotations/.idea/compiler.xml
new file mode 100644
index 0000000000..2c3c2d00c3
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/encodings.xml b/persistence-modules/hibernate-annotations/.idea/encodings.xml
new file mode 100644
index 0000000000..aa00ffab78
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__antlr_antlr_2_7_7.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__antlr_antlr_2_7_7.xml
new file mode 100644
index 0000000000..b8d93d8e01
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__antlr_antlr_2_7_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml
new file mode 100644
index 0000000000..cdd79598ea
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml
new file mode 100644
index 0000000000..6c2a7607f1
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_experlog_xapool_1_5_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_experlog_xapool_1_5_0.xml
new file mode 100644
index 0000000000..ed3d184b0a
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_experlog_xapool_1_5_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml
new file mode 100644
index 0000000000..33c30b4c89
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_h2database_h2_1_4_200.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_h2database_h2_1_4_200.xml
new file mode 100644
index 0000000000..98dbdb5af7
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_h2database_h2_1_4_200.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml
new file mode 100644
index 0000000000..4d7e82ee70
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml
new file mode 100644
index 0000000000..de27a39699
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
new file mode 100644
index 0000000000..ff49512a0e
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml
new file mode 100644
index 0000000000..b7d39c62ba
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
new file mode 100644
index 0000000000..059f88ffa7
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__junit_junit_4_12.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 0000000000..d411041745
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__log4j_log4j_1_2_17.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__log4j_log4j_1_2_17.xml
new file mode 100644
index 0000000000..e383c1bf1e
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__log4j_log4j_1_2_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_2.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_2.xml
new file mode 100644
index 0000000000..c01a21feee
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml
new file mode 100644
index 0000000000..a0c169abac
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml
new file mode 100644
index 0000000000..33b78e93d6
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml
new file mode 100644
index 0000000000..7ee7fe0883
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml
new file mode 100644
index 0000000000..a82457d51f
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml
new file mode 100644
index 0000000000..6c8b371c95
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_geolatte_geolatte_geom_1_4_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_geolatte_geolatte_geom_1_4_0.xml
new file mode 100644
index 0000000000..fd1928d428
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_geolatte_geolatte_geom_1_4_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml
new file mode 100644
index 0000000000..0c7a80a835
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml
new file mode 100644
index 0000000000..638d9377ef
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml
new file mode 100644
index 0000000000..56193163f3
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000000..f58bbc1127
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
new file mode 100644
index 0000000000..78dbe458d4
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml
new file mode 100644
index 0000000000..1fd775b53b
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_7_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_7_Final.xml
new file mode 100644
index 0000000000..c0032c5702
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_7_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_spatial_5_4_7_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_spatial_5_4_7_Final.xml
new file mode 100644
index 0000000000..2ff4fb6567
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_spatial_5_4_7_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_testing_5_4_7_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_testing_5_4_7_Final.xml
new file mode 100644
index 0000000000..dc3c12b134
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_hibernate_hibernate_testing_5_4_7_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml
new file mode 100644
index 0000000000..a9de551cc3
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_4_0_8.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_4_0_8.xml
new file mode 100644
index 0000000000..21b5f5b9a6
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_4_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_bmunit_4_0_8.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_bmunit_4_0_8.xml
new file mode 100644
index 0000000000..c481a97645
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_bmunit_4_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_install_4_0_8.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_install_4_0_8.xml
new file mode 100644
index 0000000000..dc501656cf
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_install_4_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_submit_4_0_8.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_submit_4_0_8.xml
new file mode 100644
index 0000000000..5f5373122a
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_byteman_byteman_submit_4_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml
new file mode 100644
index 0000000000..34e9ada6c7
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jbossts_jbossjta_4_16_4_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jbossts_jbossjta_4_16_4_Final.xml
new file mode 100644
index 0000000000..d1d90f6253
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_jbossts_jbossjta_4_16_4_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
new file mode 100644
index 0000000000..5f7dd01e2b
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml
new file mode 100644
index 0000000000..ec03510bec
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_2_0.xml
new file mode 100644
index 0000000000..3c2d85c28b
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_2_0.xml
new file mode 100644
index 0000000000..614200c2ad
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_2_0.xml
new file mode 100644
index 0000000000..7b363ded13
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_2_0.xml
new file mode 100644
index 0000000000..92d6f7086d
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_2_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_2_0.xml
new file mode 100644
index 0000000000..5b2606a84a
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml
new file mode 100644
index 0000000000..ee8e8ef36e
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml
new file mode 100644
index 0000000000..5654d1f37d
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml
new file mode 100644
index 0000000000..f3bb7f6b81
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
new file mode 100644
index 0000000000..af41e3b617
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_opentest4j_opentest4j_1_1_0.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_opentest4j_opentest4j_1_1_0.xml
new file mode 100644
index 0000000000..79af13d934
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_opentest4j_opentest4j_1_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_postgresql_postgresql_42_2_2.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_postgresql_postgresql_42_2_2.xml
new file mode 100644
index 0000000000..95fc49e407
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_postgresql_postgresql_42_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
new file mode 100644
index 0000000000..2f93a6301e
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml
new file mode 100644
index 0000000000..1b644dd840
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/misc.xml b/persistence-modules/hibernate-annotations/.idea/misc.xml
new file mode 100644
index 0000000000..4361200542
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/misc.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/.idea/vcs.xml b/persistence-modules/hibernate-annotations/.idea/vcs.xml
new file mode 100644
index 0000000000..b2bdec2d71
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java
new file mode 100644
index 0000000000..afe2aeac89
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java
@@ -0,0 +1,73 @@
+package com.baeldung.hibernate;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+import com.baeldung.hibernate.joincolumn.Email;
+import com.baeldung.hibernate.joincolumn.Office;
+import com.baeldung.hibernate.joincolumn.OfficeAddress;
+
+public class HibernateUtil {
+ private static String PROPERTY_FILE_NAME;
+
+ public static SessionFactory getSessionFactory() throws IOException {
+ return getSessionFactory(null);
+ }
+
+ public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ return makeSessionFactory(serviceRegistry);
+ }
+
+ public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException {
+ ServiceRegistry serviceRegistry = configureServiceRegistry(properties);
+ return makeSessionFactory(serviceRegistry);
+ }
+
+ private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+
+ metadataSources.addPackage("com.baeldung.hibernate.pojo");
+ metadataSources.addAnnotatedClass(com.baeldung.hibernate.joincolumn.OfficialEmployee.class);
+ metadataSources.addAnnotatedClass(Email.class);
+ metadataSources.addAnnotatedClass(Office.class);
+ metadataSources.addAnnotatedClass(OfficeAddress.class);
+
+ Metadata metadata = metadataSources.getMetadataBuilder()
+ .build();
+
+ return metadata.getSessionFactoryBuilder()
+ .build();
+
+ }
+
+ private static ServiceRegistry configureServiceRegistry() throws IOException {
+ return configureServiceRegistry(getProperties());
+ }
+
+ private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException {
+ return new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ }
+
+ public static Properties getProperties() throws IOException {
+ Properties properties = new Properties();
+ URL propertiesURL = Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties"));
+ try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+ properties.load(inputStream);
+ }
+ return properties;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java
new file mode 100644
index 0000000000..99d9505ea3
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java
@@ -0,0 +1,8 @@
+package com.baeldung.hibernate;
+
+public class UnsupportedTenancyException extends Exception {
+ public UnsupportedTenancyException (String message) {
+ super(message);
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java
new file mode 100644
index 0000000000..d559e5a6c2
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java
@@ -0,0 +1,69 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public class Address {
+
+ private String addressLine1;
+ private String addressLine2;
+ private String city;
+ private String country;
+ private int zipCode;
+
+ public String getAddressLine1() {
+ return addressLine1;
+ }
+
+ public String getAddressLine2() {
+ return addressLine2;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public int getZipCode() {
+ return zipCode;
+ }
+
+ public void setAddressLine1(String addressLine1) {
+ this.addressLine1 = addressLine1;
+ }
+
+ public void setAddressLine2(String addressLine2) {
+ this.addressLine2 = addressLine2;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public void setZipCode(int zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Address address = (Address) o;
+ return zipCode == address.zipCode &&
+ Objects.equals(addressLine1, address.addressLine1) &&
+ Objects.equals(addressLine2, address.addressLine2) &&
+ Objects.equals(city, address.city) &&
+ Objects.equals(country, address.country);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(addressLine1, addressLine2, city, country, zipCode);
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java
new file mode 100644
index 0000000000..c10c67df9a
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java
@@ -0,0 +1,169 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.type.IntegerType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+
+public class AddressType implements CompositeUserType {
+
+ @Override
+ public String[] getPropertyNames() {
+ return new String[]{"addressLine1", "addressLine2",
+ "city", "country", "zipcode"};
+ }
+
+ @Override
+ public Type[] getPropertyTypes() {
+ return new Type[]{StringType.INSTANCE, StringType.INSTANCE,
+ StringType.INSTANCE, StringType.INSTANCE, IntegerType.INSTANCE};
+ }
+
+ @Override
+ public Object getPropertyValue(Object component, int property) throws HibernateException {
+
+ Address empAdd = (Address) component;
+
+ switch (property) {
+ case 0:
+ return empAdd.getAddressLine1();
+ case 1:
+ return empAdd.getAddressLine2();
+ case 2:
+ return empAdd.getCity();
+ case 3:
+ return empAdd.getCountry();
+ case 4:
+ return Integer.valueOf(empAdd.getZipCode());
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+ }
+
+ @Override
+ public void setPropertyValue(Object component, int property, Object value) throws HibernateException {
+
+ Address empAdd = (Address) component;
+
+ switch (property) {
+ case 0:
+ empAdd.setAddressLine1((String) value);
+ case 1:
+ empAdd.setAddressLine2((String) value);
+ case 2:
+ empAdd.setCity((String) value);
+ case 3:
+ empAdd.setCountry((String) value);
+ case 4:
+ empAdd.setZipCode((Integer) value);
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Address.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x == y)
+ return true;
+
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+
+ Address empAdd = new Address();
+ empAdd.setAddressLine1(rs.getString(names[0]));
+
+ if (rs.wasNull())
+ return null;
+
+ empAdd.setAddressLine2(rs.getString(names[1]));
+ empAdd.setCity(rs.getString(names[2]));
+ empAdd.setCountry(rs.getString(names[3]));
+ empAdd.setZipCode(rs.getInt(names[4]));
+
+ return empAdd;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+ if (Objects.isNull(value))
+ st.setNull(index, Types.VARCHAR);
+ else {
+
+ Address empAdd = (Address) value;
+ st.setString(index, empAdd.getAddressLine1());
+ st.setString(index + 1, empAdd.getAddressLine2());
+ st.setString(index + 2, empAdd.getCity());
+ st.setString(index + 3, empAdd.getCountry());
+ st.setInt(index + 4, empAdd.getZipCode());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+
+ if (Objects.isNull(value))
+ return null;
+
+ Address oldEmpAdd = (Address) value;
+ Address newEmpAdd = new Address();
+
+ newEmpAdd.setAddressLine1(oldEmpAdd.getAddressLine1());
+ newEmpAdd.setAddressLine2(oldEmpAdd.getAddressLine2());
+ newEmpAdd.setCity(oldEmpAdd.getCity());
+ newEmpAdd.setCountry(oldEmpAdd.getCountry());
+ newEmpAdd.setZipCode(oldEmpAdd.getZipCode());
+
+ return newEmpAdd;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return true;
+ }
+
+ @Override
+ public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException {
+ return (Serializable) deepCopy(value);
+ }
+
+ @Override
+ public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return deepCopy(cached);
+ }
+
+ @Override
+ public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return original;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java
new file mode 100644
index 0000000000..56be9e693f
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java
@@ -0,0 +1,51 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.type.LocalDateType;
+import org.hibernate.type.descriptor.WrapperOptions;
+import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
+import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
+import org.hibernate.type.descriptor.java.MutabilityPlan;
+
+import java.time.LocalDate;
+
+public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor {
+
+ public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor();
+
+ public LocalDateStringJavaDescriptor() {
+ super(LocalDate.class, ImmutableMutabilityPlan.INSTANCE);
+ }
+
+ @Override
+ public String toString(LocalDate value) {
+ return LocalDateType.FORMATTER.format(value);
+ }
+
+ @Override
+ public LocalDate fromString(String string) {
+ return LocalDate.from(LocalDateType.FORMATTER.parse(string));
+ }
+
+ @Override
+ public X unwrap(LocalDate value, Class type, WrapperOptions options) {
+
+ if (value == null)
+ return null;
+
+ if (String.class.isAssignableFrom(type))
+ return (X) LocalDateType.FORMATTER.format(value);
+
+ throw unknownUnwrap(type);
+ }
+
+ @Override
+ public LocalDate wrap(X value, WrapperOptions options) {
+ if (value == null)
+ return null;
+
+ if(String.class.isInstance(value))
+ return LocalDate.from(LocalDateType.FORMATTER.parse((CharSequence) value));
+
+ throw unknownWrap(value.getClass());
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java
new file mode 100644
index 0000000000..c8d37073e8
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.type.AbstractSingleColumnStandardBasicType;
+import org.hibernate.type.DiscriminatorType;
+import org.hibernate.type.descriptor.java.LocalDateJavaDescriptor;
+import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
+
+import java.time.LocalDate;
+
+public class LocalDateStringType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType {
+
+ public static final LocalDateStringType INSTANCE = new LocalDateStringType();
+
+ public LocalDateStringType() {
+ super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE);
+ }
+
+ @Override
+ public String getName() {
+ return "LocalDateString";
+ }
+
+ @Override
+ public LocalDate stringToObject(String xml) throws Exception {
+ return fromString(xml);
+ }
+
+ @Override
+ public String objectToSQLString(LocalDate value, Dialect dialect) throws Exception {
+ return '\'' + toString(value) + '\'';
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
new file mode 100644
index 0000000000..3ca06e4316
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
@@ -0,0 +1,88 @@
+package com.baeldung.hibernate.customtypes;
+
+import com.baeldung.hibernate.pojo.Phone;
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.time.LocalDate;
+
+@TypeDef(name = "PhoneNumber",
+ typeClass = PhoneNumberType.class,
+ defaultForType = PhoneNumber.class)
+@Entity
+@Table(name = "OfficeEmployee")
+public class OfficeEmployee {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ @Column
+ @Type(type = "LocalDateString")
+ private LocalDate dateOfJoining;
+
+ @Columns(columns = {@Column(name = "country_code"),
+ @Column(name = "city_code"),
+ @Column(name = "number")})
+ private PhoneNumber employeeNumber;
+
+ @Columns(columns = {@Column(name = "address_line_1"),
+ @Column(name = "address_line_2"),
+ @Column(name = "city"), @Column(name = "country"),
+ @Column(name = "zip_code")})
+ @Type(type = "com.baeldung.hibernate.customtypes.AddressType")
+ private Address empAddress;
+
+ @Type(type = "com.baeldung.hibernate.customtypes.SalaryType",
+ parameters = {@Parameter(name = "currency", value = "USD")})
+ @Columns(columns = {@Column(name = "amount"),
+ @Column(name = "currency")})
+ private Salary salary;
+
+ public Salary getSalary() {
+ return salary;
+ }
+
+ public void setSalary(Salary salary) {
+ this.salary = salary;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public LocalDate getDateOfJoining() {
+ return dateOfJoining;
+ }
+
+ public void setDateOfJoining(LocalDate dateOfJoining) {
+ this.dateOfJoining = dateOfJoining;
+ }
+
+ public PhoneNumber getEmployeeNumber() {
+ return employeeNumber;
+ }
+
+ public void setEmployeeNumber(PhoneNumber employeeNumber) {
+ this.employeeNumber = employeeNumber;
+ }
+
+ public Address getEmpAddress() {
+ return empAddress;
+ }
+
+ public void setEmpAddress(Address empAddress) {
+ this.empAddress = empAddress;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java
new file mode 100644
index 0000000000..0be6cbc910
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java
@@ -0,0 +1,43 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public final class PhoneNumber {
+
+ private final int countryCode;
+ private final int cityCode;
+ private final int number;
+
+ public PhoneNumber(int countryCode, int cityCode, int number) {
+ this.countryCode = countryCode;
+ this.cityCode = cityCode;
+ this.number = number;
+ }
+
+ public int getCountryCode() {
+ return countryCode;
+ }
+
+ public int getCityCode() {
+ return cityCode;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PhoneNumber that = (PhoneNumber) o;
+ return countryCode == that.countryCode &&
+ cityCode == that.cityCode &&
+ number == that.number;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(countryCode, cityCode, number);
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java
new file mode 100644
index 0000000000..9f09352bec
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java
@@ -0,0 +1,98 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+
+
+public class PhoneNumberType implements UserType {
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return PhoneNumber.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x == y)
+ return true;
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+ int countryCode = rs.getInt(names[0]);
+
+ if (rs.wasNull())
+ return null;
+
+ int cityCode = rs.getInt(names[1]);
+ int number = rs.getInt(names[2]);
+ PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number);
+
+ return employeeNumber;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+ if (Objects.isNull(value)) {
+ st.setNull(index, Types.INTEGER);
+ } else {
+ PhoneNumber employeeNumber = (PhoneNumber) value;
+ st.setInt(index,employeeNumber.getCountryCode());
+ st.setInt(index+1,employeeNumber.getCityCode());
+ st.setInt(index+2,employeeNumber.getNumber());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ if (Objects.isNull(value))
+ return null;
+
+ PhoneNumber empNumber = (PhoneNumber) value;
+ PhoneNumber newEmpNumber = new PhoneNumber(empNumber.getCountryCode(),empNumber.getCityCode(),empNumber.getNumber());
+
+ return newEmpNumber;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java
new file mode 100644
index 0000000000..f9a7ac5902
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java
@@ -0,0 +1,39 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public class Salary {
+
+ private Long amount;
+ private String currency;
+
+ public Long getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Long amount) {
+ this.amount = amount;
+ }
+
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Salary salary = (Salary) o;
+ return Objects.equals(amount, salary.amount) &&
+ Objects.equals(currency, salary.currency);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(amount, currency);
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java
new file mode 100644
index 0000000000..340c697c11
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java
@@ -0,0 +1,15 @@
+package com.baeldung.hibernate.customtypes;
+
+public class SalaryCurrencyConvertor {
+
+ public static Long convert(Long amount, String oldCurr, String newCurr){
+ if (newCurr.equalsIgnoreCase(oldCurr))
+ return amount;
+
+ return convertTo();
+ }
+
+ private static Long convertTo() {
+ return 10L;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java
new file mode 100644
index 0000000000..266b85140b
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java
@@ -0,0 +1,161 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.type.LongType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+import org.hibernate.usertype.DynamicParameterizedType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+import java.util.Properties;
+
+public class SalaryType implements CompositeUserType, DynamicParameterizedType {
+
+ private String localCurrency;
+
+ @Override
+ public String[] getPropertyNames() {
+ return new String[]{"amount", "currency"};
+ }
+
+ @Override
+ public Type[] getPropertyTypes() {
+ return new Type[]{LongType.INSTANCE, StringType.INSTANCE};
+ }
+
+ @Override
+ public Object getPropertyValue(Object component, int property) throws HibernateException {
+
+ Salary salary = (Salary) component;
+
+ switch (property) {
+ case 0:
+ return salary.getAmount();
+ case 1:
+ return salary.getCurrency();
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+
+ @Override
+ public void setPropertyValue(Object component, int property, Object value) throws HibernateException {
+
+ Salary salary = (Salary) component;
+
+ switch (property) {
+ case 0:
+ salary.setAmount((Long) value);
+ case 1:
+ salary.setCurrency((String) value);
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Salary.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+
+ if (x == y)
+ return true;
+
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+
+ Salary salary = new Salary();
+ salary.setAmount(rs.getLong(names[0]));
+
+ if (rs.wasNull())
+ return null;
+
+ salary.setCurrency(rs.getString(names[1]));
+
+ return salary;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+
+ if (Objects.isNull(value))
+ st.setNull(index, Types.BIGINT);
+ else {
+
+ Salary salary = (Salary) value;
+ st.setLong(index, SalaryCurrencyConvertor.convert(salary.getAmount(),
+ salary.getCurrency(), localCurrency));
+ st.setString(index + 1, salary.getCurrency());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+
+ if (Objects.isNull(value))
+ return null;
+
+ Salary oldSal = (Salary) value;
+ Salary newSal = new Salary();
+
+ newSal.setAmount(oldSal.getAmount());
+ newSal.setCurrency(oldSal.getCurrency());
+
+ return newSal;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return true;
+ }
+
+ @Override
+ public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException {
+ return (Serializable) deepCopy(value);
+ }
+
+ @Override
+ public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return deepCopy(cached);
+ }
+
+ @Override
+ public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return original;
+ }
+
+ @Override
+ public void setParameterValues(Properties parameters) {
+ this.localCurrency = parameters.getProperty("currency");
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java
new file mode 100644
index 0000000000..df07c3cf69
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java
@@ -0,0 +1,47 @@
+package com.baeldung.hibernate.joincolumn;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class Email {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String address;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "employee_id")
+ private OfficialEmployee employee;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public OfficialEmployee getEmployee() {
+ return employee;
+ }
+
+ public void setEmployee(OfficialEmployee employee) {
+ this.employee = employee;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java
new file mode 100644
index 0000000000..9940577761
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java
@@ -0,0 +1,41 @@
+package com.baeldung.hibernate.joincolumn;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class Office {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumns({
+ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
+ @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
+ })
+ private OfficeAddress address;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public OfficeAddress getAddress() {
+ return address;
+ }
+
+ public void setAddress(OfficeAddress address) {
+ this.address = address;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java
new file mode 100644
index 0000000000..cc723db6a2
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.joincolumn;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class OfficeAddress {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @Column(name = "ZIP")
+ private String zipCode;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java
new file mode 100644
index 0000000000..49c63c7578
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java
@@ -0,0 +1,36 @@
+package com.baeldung.hibernate.joincolumn;
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+@Entity
+public class OfficialEmployee {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
+ private List emails;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public List getEmails() {
+ return emails;
+ }
+
+ public void setEmails(List emails) {
+ this.emails = emails;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
new file mode 100644
index 0000000000..46e6824f42
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.oneToMany.config;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+public class HibernateAnnotationUtil {
+
+ private static SessionFactory sessionFactory;
+
+ private static SessionFactory buildSessionFactory() {
+ try {
+ // Create the SessionFactory from hibernate-annotation.cfg.xml
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate-annotation.cfg.xml").build();
+ Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build();
+ SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
+
+ return sessionFactory;
+
+ } catch (Throwable ex) {
+ System.err.println("Initial SessionFactory creation failed." + ex);
+ ex.printStackTrace();
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static SessionFactory getSessionFactory() {
+ if (sessionFactory == null)
+ sessionFactory = buildSessionFactory();
+ return sessionFactory;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java
new file mode 100644
index 0000000000..372fb2fc07
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java
@@ -0,0 +1,71 @@
+package com.baeldung.hibernate.oneToMany.main;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+
+import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil;
+import com.baeldung.hibernate.oneToMany.model.Cart;
+import com.baeldung.hibernate.oneToMany.model.Items;
+import com.baeldung.hibernate.oneToMany.model.ItemsOIO;
+
+public class HibernateManyisOwningSide {
+ public static void main(String[] args) {
+
+ Cart cart = new Cart();
+ Cart cart2 = new Cart();
+
+ Items item1 = new Items(cart);
+ Items item2 = new Items(cart2);
+ Set itemsSet = new HashSet();
+ itemsSet.add(item1);
+ itemsSet.add(item2);
+
+ cart.setItems(itemsSet);
+
+
+
+ SessionFactory sessionFactory = null;
+ Session session = null;
+ Transaction tx = null;
+ try {
+ // Get Session
+ sessionFactory = HibernateAnnotationUtil.getSessionFactory();
+ session = sessionFactory.getCurrentSession();
+ System.out.println("Session created");
+ // start transaction
+ tx = session.beginTransaction();
+ // Save the Model object
+ session.save(cart);
+ session.save(cart2);
+ session.save(item1);
+ session.save(item2);
+ // Commit transaction
+ tx.commit();
+ session = sessionFactory.getCurrentSession();
+ tx = session.beginTransaction();
+
+ item1 = (Items) session.get(Items.class, new Long(1));
+ item2 = (Items) session.get(Items.class, new Long(2));
+ tx.commit();
+
+
+ System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart()
+ .getId());
+ System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart()
+ .getId());
+
+ } catch (Exception e) {
+ System.out.println("Exception occured. " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (!sessionFactory.isClosed()) {
+ System.out.println("Closing SessionFactory");
+ sessionFactory.close();
+ }
+ }
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java
new file mode 100644
index 0000000000..2bc5e514f7
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java
@@ -0,0 +1,60 @@
+package com.baeldung.hibernate.oneToMany.main;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+
+import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil;
+import com.baeldung.hibernate.oneToMany.model.Cart;
+import com.baeldung.hibernate.oneToMany.model.Items;
+
+public class HibernateOneToManyAnnotationMain {
+
+ public static void main(String[] args) {
+
+ Cart cart = new Cart();
+
+ Items item1 = new Items(cart);
+ Items item2 = new Items(cart);
+ Set itemsSet = new HashSet();
+ itemsSet.add(item1);
+ itemsSet.add(item2);
+
+ cart.setItems(itemsSet);
+
+
+ SessionFactory sessionFactory = null;
+ Session session = null;
+ Transaction tx = null;
+ try {
+ // Get Session
+ sessionFactory = HibernateAnnotationUtil.getSessionFactory();
+ session = sessionFactory.getCurrentSession();
+ System.out.println("Session created");
+ // start transaction
+ tx = session.beginTransaction();
+ // Save the Model object
+ session.save(cart);
+ session.save(item1);
+ session.save(item2);
+ // Commit transaction
+ tx.commit();
+ System.out.println("Cart ID=" + cart.getId());
+ System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId());
+ System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId());
+
+ } catch (Exception e) {
+ System.out.println("Exception occured. " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (!sessionFactory.isClosed()) {
+ System.out.println("Closing SessionFactory");
+ sessionFactory.close();
+ }
+ }
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java
new file mode 100644
index 0000000000..0777664dd0
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java
@@ -0,0 +1,67 @@
+package com.baeldung.hibernate.oneToMany.main;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+
+import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil;
+import com.baeldung.hibernate.oneToMany.model.CartOIO;
+import com.baeldung.hibernate.oneToMany.model.ItemsOIO;
+
+public class HibernateOneisOwningSide {
+ public static void main(String[] args) {
+
+ CartOIO cart = new CartOIO();
+ CartOIO cart2 = new CartOIO();
+
+ ItemsOIO item1 = new ItemsOIO(cart);
+ ItemsOIO item2 = new ItemsOIO(cart2);
+ Set itemsSet = new HashSet();
+ itemsSet.add(item1);
+ itemsSet.add(item2);
+
+ cart.setItems(itemsSet);
+
+ SessionFactory sessionFactory = null;
+ Session session = null;
+ Transaction tx = null;
+ try {
+ // Get Session
+ sessionFactory = HibernateAnnotationUtil.getSessionFactory();
+ session = sessionFactory.getCurrentSession();
+ System.out.println("Session created");
+ // start transaction
+ tx = session.beginTransaction();
+ // Save the Model object
+ session.save(cart);
+ session.save(cart2);
+ session.save(item1);
+ session.save(item2);
+ // Commit transaction
+ tx.commit();
+
+ session = sessionFactory.getCurrentSession();
+ tx = session.beginTransaction();
+ item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1));
+ item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2));
+ tx.commit();
+
+ System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO()
+ .getId());
+ System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO()
+ .getId());
+
+ } catch (Exception e) {
+ System.out.println("Exception occured. " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (!sessionFactory.isClosed()) {
+ System.out.println("Closing SessionFactory");
+ sessionFactory.close();
+ }
+ }
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java
new file mode 100644
index 0000000000..b8b991831e
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java
@@ -0,0 +1,43 @@
+package com.baeldung.hibernate.oneToMany.model;
+
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "CART")
+public class Cart {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "cart_id")
+ private long id;
+
+
+ @OneToMany(mappedBy = "cart")
+ private Set items;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+
+ public Set getItems() {
+ return items;
+ }
+
+ public void setItems(Set items) {
+ this.items = items;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java
new file mode 100644
index 0000000000..8a5ed5e7a4
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java
@@ -0,0 +1,42 @@
+package com.baeldung.hibernate.oneToMany.model;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+
+
+@Entity
+@Table(name = "CARTOIO")
+public class CartOIO {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @OneToMany
+ @JoinColumn(name = "cart_id") // we need to duplicate the physical information
+ private Set items;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Set getItems() {
+ return items;
+ }
+
+ public void setItems(Set items) {
+ this.items = items;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java
new file mode 100644
index 0000000000..f63a4855b5
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java
@@ -0,0 +1,50 @@
+package com.baeldung.hibernate.oneToMany.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "ITEMS")
+public class Items {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private long id;
+
+
+ @ManyToOne
+ @JoinColumn(name = "cart_id", nullable = false)
+ private Cart cart;
+
+ // Hibernate requires no-args constructor
+ public Items() {
+ }
+
+ public Items(Cart c) {
+ this.cart = c;
+ }
+
+ public Cart getCart() {
+ return cart;
+ }
+
+ public void setCart(Cart cart) {
+ this.cart = cart;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java
new file mode 100644
index 0000000000..a3d6a796c5
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java
@@ -0,0 +1,47 @@
+package com.baeldung.hibernate.oneToMany.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "ITEMSOIO")
+public class ItemsOIO {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @ManyToOne
+ @JoinColumn(name = "cart_id", insertable = false, updatable = false)
+ private CartOIO cart;
+
+ // Hibernate requires no-args constructor
+ public ItemsOIO() {
+ }
+
+ public ItemsOIO(CartOIO c) {
+ this.cart = c;
+ }
+
+ public CartOIO getCartOIO() {
+ return cart;
+ }
+
+ public void setCartOIO(CartOIO cart) {
+ this.cart = cart;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java
new file mode 100644
index 0000000000..d923bda5de
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java
@@ -0,0 +1,50 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Entity
+public class Phone implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private boolean deleted;
+
+ private String number;
+
+ public Phone() {
+ }
+
+ public Phone(String number) {
+ this.number = number;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java
new file mode 100644
index 0000000000..04684eceac
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java
@@ -0,0 +1,56 @@
+package com.baeldung.hibernate.wherejointable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+@Entity(name = "e_group")
+public class Group {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+
+ @ManyToMany(mappedBy = "groups")
+ private List users = new ArrayList<>();
+
+ public Group(String name) {
+ this.name = name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getUsers() {
+ return users;
+ }
+
+ public void setUsers(List users) {
+ this.users = users;
+ }
+
+ @Override
+ public String toString() {
+ return "Group [name=" + name + "]";
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java
new file mode 100644
index 0000000000..7fc077eeb2
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java
@@ -0,0 +1,74 @@
+package com.baeldung.hibernate.wherejointable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.WhereJoinTable;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+
+ @ManyToMany
+ @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
+ private List groups = new ArrayList<>();
+
+ @WhereJoinTable(clause = "role='MODERATOR'")
+ @ManyToMany
+ @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
+ private List moderatorGroups = new ArrayList<>();
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getGroups() {
+ return groups;
+ }
+
+ public void setGroups(List groups) {
+ this.groups = groups;
+ }
+
+ public void setModeratorGroups(List moderatorGroups) {
+ this.moderatorGroups = moderatorGroups;
+ }
+
+ public List getModeratorGroups() {
+ return moderatorGroups;
+ }
+
+ @Override
+ public String toString() {
+ return "User [name=" + name + "]";
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java
new file mode 100644
index 0000000000..00dd19699c
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java
@@ -0,0 +1,31 @@
+package com.baeldung.hibernate.wherejointable;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+
+@Entity(name = "r_user_group")
+public class UserGroupRelation implements Serializable {
+
+ @Id
+ @Column(name = "user_id", insertable = false, updatable = false)
+ private final Long userId;
+
+ @Id
+ @Column(name = "group_id", insertable = false, updatable = false)
+ private final Long groupId;
+
+ @Enumerated(EnumType.STRING)
+ private final UserGroupRole role;
+
+ public UserGroupRelation(Long userId, Long groupId, UserGroupRole role) {
+ this.userId = userId;
+ this.groupId = groupId;
+ this.role = role;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java
new file mode 100644
index 0000000000..62d9cb28ea
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java
@@ -0,0 +1,7 @@
+package com.baeldung.hibernate.wherejointable;
+
+public enum UserGroupRole {
+
+ MEMBER, MODERATOR
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000..474eeb7a44
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,18 @@
+
+
+
+ Hibernate EntityManager Demo
+ true
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/resources/logback.xml b/persistence-modules/hibernate-annotations/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file