diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5ff6309b7199129c1afe4f4ec1906e640bec48c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000000000000000000000000000000000000..0168272e1e35b3b5fe6e329825d0d462a06a074c --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,568 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="DBNavigator.Project.DataEditorManager"> + <record-view-column-sorting-type value="BY_INDEX" /> + <value-preview-text-wrapping value="false" /> + <value-preview-pinned value="false" /> + </component> + <component name="DBNavigator.Project.DataExportManager"> + <export-instructions> + <create-header value="true" /> + <friendly-headers value="false" /> + <quote-values-containing-separator value="true" /> + <quote-all-values value="false" /> + <value-separator value="" /> + <file-name value="" /> + <file-location value="" /> + <scope value="GLOBAL" /> + <destination value="FILE" /> + <format value="EXCEL" /> + <charset value="windows-1252" /> + <charset value="windows-1252" /> + </export-instructions> + </component> + <component name="DBNavigator.Project.DatabaseBrowserManager"> + <autoscroll-to-editor value="false" /> + <autoscroll-from-editor value="true" /> + <show-object-properties value="true" /> + <loaded-nodes /> + </component> + <component name="DBNavigator.Project.DatabaseConsoleManager"> + <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611"> + <console name="MySQL Connection" type="STANDARD" schema="notenmanager" session="Main" /> + <console name="phpmyadmin" type="STANDARD" schema="notenmanager" session="Main" /> + </connection> + </component> + <component name="DBNavigator.Project.DatabaseFileManager"> + <open-files> + <object connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" object-ref="schemas/notenmanager/tables/kurs" /> + <object connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" object-ref="schemas/notenmanager/tables/studiengang" /> + </open-files> + </component> + <component name="DBNavigator.Project.DatabaseSessionManager"> + <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" /> + </component> + <component name="DBNavigator.Project.DatasetFilterManager"> + <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.course" active-filter-id="EMPTY_FILTER" /> + <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.coursesofstudy" active-filter-id="EMPTY_FILTER" /> + <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.kurs" active-filter-id="EMPTY_FILTER" /> + <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.studiengang" active-filter-id="EMPTY_FILTER" /> + </component> + <component name="DBNavigator.Project.EditorStateManager"> + <last-used-providers /> + </component> + <component name="DBNavigator.Project.ExecutionManager"> + <retain-sticky-names value="false" /> + </component> + <component name="DBNavigator.Project.MethodExecutionManager"> + <method-browser /> + <execution-history> + <group-entries value="true" /> + <execution-inputs /> + </execution-history> + <argument-values-cache /> + </component> + <component name="DBNavigator.Project.ObjectDependencyManager"> + <last-used-dependency-type value="INCOMING" /> + </component> + <component name="DBNavigator.Project.ObjectQuickFilterManager"> + <last-used-operator value="EQUAL" /> + <filters /> + </component> + <component name="DBNavigator.Project.ParserDiagnosticsManager"> + <diagnostics-history /> + </component> + <component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true"> + <recently-used-interfaces /> + </component> + <component name="DBNavigator.Project.Settings"> + <connections> + <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" active="true" signed="true"> + <database> + <name value="MySQL Connection" /> + <description value="DB für den Notenmanager" /> + <database-type value="MYSQL" /> + <config-type value="BASIC" /> + <database-version value="5.5" /> + <driver-source value="BUILTIN" /> + <driver-library value="" /> + <driver value="" /> + <url-type value="DATABASE" /> + <host value="localhost" /> + <port value="3306" /> + <database value="notenmanager" /> + <type value="USER" /> + <user value="root" /> + <deprecated-pwd value="" /> + </database> + <properties> + <auto-commit value="false" /> + <properties> + <property key="serverTimezone" value="UTC" /> + </properties> + </properties> + <ssh-settings> + <active value="false" /> + <proxy-host value="" /> + <proxy-port value="22" /> + <proxy-user value="" /> + <deprecated-proxy-pwd value="" /> + <auth-type value="PASSWORD" /> + <key-file value="" /> + <key-passphrase value="" /> + </ssh-settings> + <ssl-settings> + <active value="false" /> + <certificate-authority-file value="" /> + <client-certificate-file value="" /> + <client-key-file value="" /> + </ssl-settings> + <details> + <charset value="UTF-8" /> + <session-management value="true" /> + <ddl-file-binding value="true" /> + <database-logging value="true" /> + <connect-automatically value="true" /> + <restore-workspace value="true" /> + <restore-workspace-deep value="false" /> + <environment-type value="default" /> + <connectivity-timeout value="5" /> + <idle-time-to-disconnect value="30" /> + <idle-time-to-disconnect-pool value="5" /> + <credential-expiry-time value="10" /> + <max-connection-pool-size value="7" /> + <alternative-statement-delimiter value="" /> + </details> + <object-filters hide-empty-schemas="false" hide-pseudo-columns="false"> + <object-type-filter> + <object-type name="SCHEMA" enabled="true" /> + <object-type name="USER" enabled="true" /> + <object-type name="ROLE" enabled="true" /> + <object-type name="PRIVILEGE" enabled="true" /> + <object-type name="CHARSET" enabled="true" /> + <object-type name="TABLE" enabled="true" /> + <object-type name="VIEW" enabled="true" /> + <object-type name="MATERIALIZED_VIEW" enabled="true" /> + <object-type name="NESTED_TABLE" enabled="true" /> + <object-type name="COLUMN" enabled="true" /> + <object-type name="INDEX" enabled="true" /> + <object-type name="CONSTRAINT" enabled="true" /> + <object-type name="DATASET_TRIGGER" enabled="true" /> + <object-type name="DATABASE_TRIGGER" enabled="true" /> + <object-type name="SYNONYM" enabled="true" /> + <object-type name="SEQUENCE" enabled="true" /> + <object-type name="PROCEDURE" enabled="true" /> + <object-type name="FUNCTION" enabled="true" /> + <object-type name="PACKAGE" enabled="true" /> + <object-type name="TYPE" enabled="true" /> + <object-type name="TYPE_ATTRIBUTE" enabled="true" /> + <object-type name="ARGUMENT" enabled="true" /> + <object-type name="DIMENSION" enabled="true" /> + <object-type name="CLUSTER" enabled="true" /> + <object-type name="DBLINK" enabled="true" /> + </object-type-filter> + <object-name-filters /> + </object-filters> + </connection> + </connections> + <browser-settings> + <general> + <display-mode value="TABBED" /> + <navigation-history-size value="100" /> + <show-object-details value="false" /> + </general> + <filters> + <object-type-filter> + <object-type name="SCHEMA" enabled="true" /> + <object-type name="USER" enabled="true" /> + <object-type name="ROLE" enabled="true" /> + <object-type name="PRIVILEGE" enabled="true" /> + <object-type name="CHARSET" enabled="true" /> + <object-type name="TABLE" enabled="true" /> + <object-type name="VIEW" enabled="true" /> + <object-type name="MATERIALIZED_VIEW" enabled="true" /> + <object-type name="NESTED_TABLE" enabled="true" /> + <object-type name="COLUMN" enabled="true" /> + <object-type name="INDEX" enabled="true" /> + <object-type name="CONSTRAINT" enabled="true" /> + <object-type name="DATASET_TRIGGER" enabled="true" /> + <object-type name="DATABASE_TRIGGER" enabled="true" /> + <object-type name="SYNONYM" enabled="true" /> + <object-type name="SEQUENCE" enabled="true" /> + <object-type name="PROCEDURE" enabled="true" /> + <object-type name="FUNCTION" enabled="true" /> + <object-type name="PACKAGE" enabled="true" /> + <object-type name="TYPE" enabled="true" /> + <object-type name="TYPE_ATTRIBUTE" enabled="true" /> + <object-type name="ARGUMENT" enabled="true" /> + <object-type name="DIMENSION" enabled="true" /> + <object-type name="CLUSTER" enabled="true" /> + <object-type name="DBLINK" enabled="true" /> + </object-type-filter> + </filters> + <sorting> + <object-type name="COLUMN" sorting-type="NAME" /> + <object-type name="FUNCTION" sorting-type="NAME" /> + <object-type name="PROCEDURE" sorting-type="NAME" /> + <object-type name="ARGUMENT" sorting-type="POSITION" /> + </sorting> + <default-editors> + <object-type name="VIEW" editor-type="SELECTION" /> + <object-type name="PACKAGE" editor-type="SELECTION" /> + <object-type name="TYPE" editor-type="SELECTION" /> + </default-editors> + </browser-settings> + <navigation-settings> + <lookup-filters> + <lookup-objects> + <object-type name="SCHEMA" enabled="true" /> + <object-type name="USER" enabled="false" /> + <object-type name="ROLE" enabled="false" /> + <object-type name="PRIVILEGE" enabled="false" /> + <object-type name="CHARSET" enabled="false" /> + <object-type name="TABLE" enabled="true" /> + <object-type name="VIEW" enabled="true" /> + <object-type name="MATERIALIZED VIEW" enabled="true" /> + <object-type name="INDEX" enabled="true" /> + <object-type name="CONSTRAINT" enabled="true" /> + <object-type name="DATASET TRIGGER" enabled="true" /> + <object-type name="DATABASE TRIGGER" enabled="true" /> + <object-type name="SYNONYM" enabled="false" /> + <object-type name="SEQUENCE" enabled="true" /> + <object-type name="PROCEDURE" enabled="true" /> + <object-type name="FUNCTION" enabled="true" /> + <object-type name="PACKAGE" enabled="true" /> + <object-type name="TYPE" enabled="true" /> + <object-type name="DIMENSION" enabled="false" /> + <object-type name="CLUSTER" enabled="false" /> + <object-type name="DBLINK" enabled="true" /> + </lookup-objects> + <force-database-load value="false" /> + <prompt-connection-selection value="true" /> + <prompt-schema-selection value="true" /> + </lookup-filters> + </navigation-settings> + <dataset-grid-settings> + <general> + <enable-zooming value="true" /> + <enable-column-tooltip value="true" /> + </general> + <sorting> + <nulls-first value="true" /> + <max-sorting-columns value="4" /> + </sorting> + <tracking-columns> + <columnNames value="" /> + <visible value="true" /> + <editable value="false" /> + </tracking-columns> + </dataset-grid-settings> + <dataset-editor-settings> + <text-editor-popup> + <active value="false" /> + <active-if-empty value="false" /> + <data-length-threshold value="100" /> + <popup-delay value="1000" /> + </text-editor-popup> + <values-actions-popup> + <show-popup-button value="true" /> + <element-count-threshold value="1000" /> + <data-length-threshold value="250" /> + </values-actions-popup> + <general> + <fetch-block-size value="100" /> + <fetch-timeout value="30" /> + <trim-whitespaces value="true" /> + <convert-empty-strings-to-null value="true" /> + <select-content-on-cell-edit value="true" /> + <large-value-preview-active value="true" /> + </general> + <filters> + <prompt-filter-dialog value="true" /> + <default-filter-type value="BASIC" /> + </filters> + <qualified-text-editor text-length-threshold="300"> + <content-types> + <content-type name="Text" enabled="true" /> + <content-type name="Properties" enabled="true" /> + <content-type name="XML" enabled="true" /> + <content-type name="DTD" enabled="true" /> + <content-type name="HTML" enabled="true" /> + <content-type name="XHTML" enabled="true" /> + <content-type name="Java" enabled="true" /> + <content-type name="SQL" enabled="true" /> + <content-type name="PL/SQL" enabled="true" /> + <content-type name="JSON" enabled="true" /> + <content-type name="JSON5" enabled="true" /> + <content-type name="Groovy" enabled="true" /> + <content-type name="AIDL" enabled="true" /> + <content-type name="YAML" enabled="true" /> + <content-type name="Manifest" enabled="true" /> + </content-types> + </qualified-text-editor> + <record-navigation> + <navigation-target value="VIEWER" /> + </record-navigation> + </dataset-editor-settings> + <code-editor-settings> + <general> + <show-object-navigation-gutter value="false" /> + <show-spec-declaration-navigation-gutter value="true" /> + <enable-spellchecking value="true" /> + <enable-reference-spellchecking value="false" /> + </general> + <confirmations> + <save-changes value="false" /> + <revert-changes value="true" /> + </confirmations> + </code-editor-settings> + <code-completion-settings> + <filters> + <basic-filter> + <filter-element type="RESERVED_WORD" id="keyword" selected="true" /> + <filter-element type="RESERVED_WORD" id="function" selected="true" /> + <filter-element type="RESERVED_WORD" id="parameter" selected="true" /> + <filter-element type="RESERVED_WORD" id="datatype" selected="true" /> + <filter-element type="RESERVED_WORD" id="exception" selected="true" /> + <filter-element type="OBJECT" id="schema" selected="true" /> + <filter-element type="OBJECT" id="role" selected="true" /> + <filter-element type="OBJECT" id="user" selected="true" /> + <filter-element type="OBJECT" id="privilege" selected="true" /> + <user-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="false" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </user-schema> + <public-schema> + <filter-element type="OBJECT" id="table" selected="false" /> + <filter-element type="OBJECT" id="view" selected="false" /> + <filter-element type="OBJECT" id="materialized view" selected="false" /> + <filter-element type="OBJECT" id="index" selected="false" /> + <filter-element type="OBJECT" id="constraint" selected="false" /> + <filter-element type="OBJECT" id="trigger" selected="false" /> + <filter-element type="OBJECT" id="synonym" selected="false" /> + <filter-element type="OBJECT" id="sequence" selected="false" /> + <filter-element type="OBJECT" id="procedure" selected="false" /> + <filter-element type="OBJECT" id="function" selected="false" /> + <filter-element type="OBJECT" id="package" selected="false" /> + <filter-element type="OBJECT" id="type" selected="false" /> + <filter-element type="OBJECT" id="dimension" selected="false" /> + <filter-element type="OBJECT" id="cluster" selected="false" /> + <filter-element type="OBJECT" id="dblink" selected="false" /> + </public-schema> + <any-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </any-schema> + </basic-filter> + <extended-filter> + <filter-element type="RESERVED_WORD" id="keyword" selected="true" /> + <filter-element type="RESERVED_WORD" id="function" selected="true" /> + <filter-element type="RESERVED_WORD" id="parameter" selected="true" /> + <filter-element type="RESERVED_WORD" id="datatype" selected="true" /> + <filter-element type="RESERVED_WORD" id="exception" selected="true" /> + <filter-element type="OBJECT" id="schema" selected="true" /> + <filter-element type="OBJECT" id="user" selected="true" /> + <filter-element type="OBJECT" id="role" selected="true" /> + <filter-element type="OBJECT" id="privilege" selected="true" /> + <user-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </user-schema> + <public-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </public-schema> + <any-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </any-schema> + </extended-filter> + </filters> + <sorting enabled="true"> + <sorting-element type="RESERVED_WORD" id="keyword" /> + <sorting-element type="RESERVED_WORD" id="datatype" /> + <sorting-element type="OBJECT" id="column" /> + <sorting-element type="OBJECT" id="table" /> + <sorting-element type="OBJECT" id="view" /> + <sorting-element type="OBJECT" id="materialized view" /> + <sorting-element type="OBJECT" id="index" /> + <sorting-element type="OBJECT" id="constraint" /> + <sorting-element type="OBJECT" id="trigger" /> + <sorting-element type="OBJECT" id="synonym" /> + <sorting-element type="OBJECT" id="sequence" /> + <sorting-element type="OBJECT" id="procedure" /> + <sorting-element type="OBJECT" id="function" /> + <sorting-element type="OBJECT" id="package" /> + <sorting-element type="OBJECT" id="type" /> + <sorting-element type="OBJECT" id="dimension" /> + <sorting-element type="OBJECT" id="cluster" /> + <sorting-element type="OBJECT" id="dblink" /> + <sorting-element type="OBJECT" id="schema" /> + <sorting-element type="OBJECT" id="role" /> + <sorting-element type="OBJECT" id="user" /> + <sorting-element type="RESERVED_WORD" id="function" /> + <sorting-element type="RESERVED_WORD" id="parameter" /> + </sorting> + <format> + <enforce-code-style-case value="true" /> + </format> + </code-completion-settings> + <execution-engine-settings> + <statement-execution> + <fetch-block-size value="100" /> + <execution-timeout value="20" /> + <debug-execution-timeout value="600" /> + <focus-result value="false" /> + <prompt-execution value="false" /> + </statement-execution> + <script-execution> + <command-line-interfaces /> + <execution-timeout value="300" /> + </script-execution> + <method-execution> + <execution-timeout value="30" /> + <debug-execution-timeout value="600" /> + <parameter-history-size value="10" /> + </method-execution> + </execution-engine-settings> + <operation-settings> + <transactions> + <uncommitted-changes> + <on-project-close value="ASK" /> + <on-disconnect value="ASK" /> + <on-autocommit-toggle value="ASK" /> + </uncommitted-changes> + <multiple-uncommitted-changes> + <on-commit value="ASK" /> + <on-rollback value="ASK" /> + </multiple-uncommitted-changes> + </transactions> + <session-browser> + <disconnect-session value="ASK" /> + <kill-session value="ASK" /> + <reload-on-filter-change value="false" /> + </session-browser> + <compiler> + <compile-type value="KEEP" /> + <compile-dependencies value="ASK" /> + <always-show-controls value="false" /> + </compiler> + <debugger> + <debugger-type value="ASK" /> + <use-generic-runners value="true" /> + </debugger> + </operation-settings> + <ddl-file-settings> + <extensions> + <mapping file-type-id="VIEW" extensions="vw" /> + <mapping file-type-id="TRIGGER" extensions="trg" /> + <mapping file-type-id="PROCEDURE" extensions="prc" /> + <mapping file-type-id="FUNCTION" extensions="fnc" /> + <mapping file-type-id="PACKAGE" extensions="pkg" /> + <mapping file-type-id="PACKAGE_SPEC" extensions="pks" /> + <mapping file-type-id="PACKAGE_BODY" extensions="pkb" /> + <mapping file-type-id="TYPE" extensions="tpe" /> + <mapping file-type-id="TYPE_SPEC" extensions="tps" /> + <mapping file-type-id="TYPE_BODY" extensions="tpb" /> + </extensions> + <general> + <lookup-ddl-files value="true" /> + <create-ddl-files value="false" /> + <synchronize-ddl-files value="true" /> + <use-qualified-names value="false" /> + <make-scripts-rerunnable value="true" /> + </general> + </ddl-file-settings> + <general-settings> + <regional-settings> + <date-format value="MEDIUM" /> + <number-format value="UNGROUPED" /> + <locale value="SYSTEM_DEFAULT" /> + <use-custom-formats value="false" /> + </regional-settings> + <environment> + <environment-types> + <environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" /> + <environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" /> + <environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" /> + <environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" /> + </environment-types> + <visibility-settings> + <connection-tabs value="true" /> + <dialog-headers value="true" /> + <object-editor-tabs value="true" /> + <script-editor-tabs value="false" /> + <execution-result-tabs value="true" /> + </visibility-settings> + </environment> + </general-settings> + </component> + <component name="DBNavigator.Project.StatementExecutionManager"> + <execution-variables /> + </component> +</project> \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000000000000000000000000000000000000..9309f17bc69a469c4570e95743915df691951916 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JpaBuddyIdeaProjectConfig" ddlActionDbType="maria"> + <option name="defaultUnitInitialized" value="true" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3016ad42d0c9de2ddb8a2c745e2beb36061ec0d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ExternalStorageConfigurationManager" enabled="true" /> + <component name="MavenProjectsManager"> + <option name="originalFiles"> + <list> + <option value="$PROJECT_DIR$/pom.xml" /> + </list> + </option> + </component> + <component name="ProjectRootManager" version="2" languageLevel="JDK_18" project-jdk-name="18" project-jdk-type="JavaSDK"> + <output url="file://$PROJECT_DIR$/out" /> + </component> + <component name="ProjectType"> + <option name="id" value="jpab" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b63946d5b31084bbb7dda418ceb3d75eb686373 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Palette2"> + <group name="Swing"> + <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" /> + </item> + <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true"> + <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" /> + <initial-values> + <property name="text" value="Button" /> + </initial-values> + </item> + <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="RadioButton" /> + </initial-values> + </item> + <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="CheckBox" /> + </initial-values> + </item> + <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="Label" /> + </initial-values> + </item> + <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1"> + <preferred-size width="-1" height="20" /> + </default-constraints> + </item> + <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" /> + </item> + </group> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000000000000000000000000000000000000..280ac52a8cee8757263389e9302e00be8445d5be --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="AutoImportSettings"> + <option name="autoReloadType" value="SELECTIVE" /> + </component> + <component name="ChangeListManager"> + <list default="true" id="0d616560-06e0-45af-8dd9-ccab83963a0f" name="Changes" comment="Hibernate ORM for DB"> + <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/src/main/Application.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/Application.java" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/src/main/classes/Course.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Course.java" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/src/main/classes/CoursesOfStudy.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/CoursesOfStudy.java" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/src/main/classes/Enrollment.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Enrollment.java" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/src/main/classes/Lecturer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Lecturer.java" afterDir="false" /> + </list> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="FileTemplateManagerImpl"> + <option name="RECENT_TEMPLATES"> + <list> + <option value="Class" /> + </list> + </option> + </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + </component> + <component name="JpbToolWindowState"> + <option name="myId2FirstActivated"> + <map> + <entry key="com.haulmont.jpb.jpaInspector" value="true" /> + <entry key="com.haulmont.jpb.jpaPalette" value="true" /> + <entry key="com.haulmont.jpb.jpaStructure" value="true" /> + </map> + </option> + <option name="myId2Visible"> + <map> + <entry key="com.haulmont.jpb.jpaInspector" value="false" /> + <entry key="com.haulmont.jpb.jpaPalette" value="false" /> + <entry key="com.haulmont.jpb.jpaStructure" value="false" /> + </map> + </option> + </component> + <component name="MarkdownSettingsMigration"> + <option name="stateVersion" value="1" /> + </component> + <component name="ProblemsViewState"> + <option name="selectedTabId" value="CurrentFile" /> + </component> + <component name="ProjectId" id="2AA7EXVwC9qbqrXYGnaxyK7xE03" /> + <component name="ProjectLevelVcsManager" settingsEditedManually="true"> + <ConfirmationsSetting value="2" id="Add" /> + </component> + <component name="ProjectViewState"> + <option name="hideEmptyMiddlePackages" value="true" /> + <option name="showLibraryContents" value="true" /> + </component> + <component name="PropertiesComponent">{ + "keyToString": { + "ASKED_ADD_EXTERNAL_FILES": "true", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "SHARE_PROJECT_CONFIGURATION_FILES": "true", + "project.structure.last.edited": "Modules", + "project.structure.proportion": "0.15", + "project.structure.side.proportion": "0.2", + "settings.editor.selected.configurable": "DBNavigator.Project.ConnectionSettings" + } +}</component> + <component name="RecentsManager"> + <key name="MoveFile.RECENT_KEYS"> + <recent name="C:\Users\tayfu\IdeaProjects\jpa-hibernate\src\main" /> + </key> + </component> + <component name="RunManager"> + <configuration name="Application" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> + <option name="MAIN_CLASS_NAME" value="Application" /> + <module name="jpa-hibernate" /> + <method v="2"> + <option name="Make" enabled="true" /> + </method> + </configuration> + <recent_temporary> + <list> + <item itemvalue="Application.Application" /> + </list> + </recent_temporary> + </component> + <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="0d616560-06e0-45af-8dd9-ccab83963a0f" name="Changes" comment="" /> + <created>1654440427551</created> + <option name="number" value="Default" /> + <option name="presentableId" value="Default" /> + <updated>1654440427551</updated> + </task> + <task id="LOCAL-00001" summary="Hibernate ORM for DB"> + <created>1655210036433</created> + <option name="number" value="00001" /> + <option name="presentableId" value="LOCAL-00001" /> + <option name="project" value="LOCAL" /> + <updated>1655210036433</updated> + </task> + <option name="localTasksCounter" value="2" /> + <servers /> + </component> + <component name="Vcs.Log.Tabs.Properties"> + <option name="TAB_STATES"> + <map> + <entry key="MAIN"> + <value> + <State /> + </value> + </entry> + </map> + </option> + </component> + <component name="VcsManagerConfiguration"> + <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" /> + <MESSAGE value="Hibernate ORM for DB" /> + <option name="LAST_COMMIT_MESSAGE" value="Hibernate ORM for DB" /> + </component> +</project> \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d198d6589970004e07340b84861f44a930110b88 --- /dev/null +++ b/pom.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.example</groupId> + <artifactId>jpa-hibernate</artifactId> + <version>1.0-SNAPSHOT</version> + + <properties> + <maven.compiler.source>18</maven.compiler.source> + <maven.compiler.target>18</maven.compiler.target> + </properties> + + <dependencies> + <dependency> + <groupId>jakarta.persistence</groupId> + <artifactId>jakarta.persistence-api</artifactId> + <version>3.1.0</version> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core-jakarta</artifactId> + <version>5.6.8.Final</version> + </dependency> + <dependency> + <groupId>org.glassfish.jaxb</groupId> + <artifactId>jaxb-runtime</artifactId> + <version>3.0.2</version> + </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>8.0.29</version> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/src/main/Application.java b/src/main/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..9241b496e60edaf8fbdfd3afaac5128fff6c217e --- /dev/null +++ b/src/main/Application.java @@ -0,0 +1,37 @@ +import classes.*; +import enumeration.*; + +import java.time.Duration; + +/** + * Defines the entry point of the Java application. + */ +public class Application +{ + private static JpaService jpaService = JpaService.getInstance(); + + public static void main(String[] args) + { + try + { + jpaService.runInTransaction(entityManager -> { + // name, semester, courseType, sws, ects, examType, isCredited + //entityManager.persist(new Course("Numerische Methoden", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null)); + //entityManager.persist(new Course("Echtzeitsysteme", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null)); + //entityManager.persist(new Course("Digitale Signalverarbeitung", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null)); + //int id, String name, String degree, int duration, int fees, String fieldOfStudy + CoursesOfStudy coursesOfStudy = new CoursesOfStudy("Angewandte Informatik", Degree.BACHELOR_OF_SCIENCE.getDegree(), 7, 62, FieldOfStudy.B_ACS_EMBEDDED_SYSTEMS.getFieldOfStudy()); + + coursesOfStudy.addCourse(new Course("Systemprogrammierung", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null)); + + entityManager.persist(coursesOfStudy); + + return null; + }); + } + finally + { + jpaService.closeResource(); + } + } +} \ No newline at end of file diff --git a/src/main/JpaService.java b/src/main/JpaService.java new file mode 100644 index 0000000000000000000000000000000000000000..18e432b8d52bbee5fbc2d73c5d45509b19c70b4b --- /dev/null +++ b/src/main/JpaService.java @@ -0,0 +1,76 @@ +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.Persistence; +import java.util.function.Function; + +/** + * A singleton implementation that encapsulates the JPA logic. + * You can configure the database connection in the + * {@link /src/main/resources/META-INF/persistence.xml} file. + */ +public class JpaService +{ + private static JpaService instance; + private EntityManagerFactory entityManagerFactory; + + private JpaService() + { + entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hibernate-notenmanager"); + } + + public static synchronized JpaService getInstance() + { + return instance == null ? instance = new JpaService() : instance; + } + + public void closeResource() + { + if(entityManagerFactory != null) + { + entityManagerFactory.close(); + } + } + + public EntityManagerFactory getEntityManagerFactory() + { + return entityManagerFactory; + } + + /** + * Runs the specified function inside a transaction boundary. The function has + * access to a ready to use {@link EntityManager} and can return any type of + * value ({@code T}). + * + * @param function The function to run. + * @param <T> The function's return type. + * @return the value returned by the specified function. + */ + public <T> T runInTransaction(Function <EntityManager, T> function) + { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction entityTransaction = entityManager.getTransaction(); + boolean isPersisted = false; + + entityTransaction.begin(); + + try + { + T returnValue = function.apply(entityManager); + isPersisted = true; + + return returnValue; + } + finally + { + if(isPersisted) + { + entityTransaction.commit(); + } + else + { + entityTransaction.rollback(); + } + } + } +} diff --git a/src/main/abstractClasses/UniversityMember.java b/src/main/abstractClasses/UniversityMember.java new file mode 100644 index 0000000000000000000000000000000000000000..e66139bc83a1966a8b5580df81c78879191ee2eb --- /dev/null +++ b/src/main/abstractClasses/UniversityMember.java @@ -0,0 +1,164 @@ +package abstractClasses; + +import enumeration.Gender; +import jakarta.persistence.*; + +import java.util.Objects; + +@MappedSuperclass +@Table(name = "Hochschulmitglied") +public abstract class UniversityMember +{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + private int id; + + @Column(name = "Geschlecht") + private String gender; + + @Column(name = "Vorname") + private String firstName; + + @Column(name = "Nachname") + private String lastName; + + @Column(name = "Wohnort") + private String placeOfResidence; + + @Column(name = "Geburtsort") + private String birthPlace; + + @Column(name = "Hochschul E-Mail") + private String officialEmail; + + @Column(name = "Private E-Mail") + private String privateEmail; + + @Column(name = "Angemeldet") + private Boolean isSignedUpForCourse; + + protected UniversityMember() + { + + } + + protected UniversityMember(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace, + String officialEmail, String privateEmail, Boolean isSignedUpForCourse) + { + this.id = id; + this.gender = gender; + this.firstName = firstName; + this.lastName = lastName; + this.placeOfResidence = placeOfResidence; + this.birthPlace = birthPlace; + this.officialEmail = officialEmail; + this.privateEmail = privateEmail; + this.isSignedUpForCourse = isSignedUpForCourse; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + UniversityMember that = (UniversityMember) o; + return id == that.id; + } + + @Override + public int hashCode() + { + return Objects.hash(id); + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public String getGender() + { + return gender; + } + + public void setGender(String gender) + { + this.gender = gender; + } + + public String getFirstName() + { + return firstName; + } + + public void setFirstName(String firstName) + { + this.firstName = firstName; + } + + public String getLastName() + { + return lastName; + } + + public void setLastName(String lastName) + { + this.lastName = lastName; + } + + public String getPlaceOfResidence() + { + return placeOfResidence; + } + + public void setPlaceOfResidence(String placeOfResidence) + { + this.placeOfResidence = placeOfResidence; + } + + public String getBirthPlace() + { + return birthPlace; + } + + public void setBirthPlace(String birthPlace) + { + this.birthPlace = birthPlace; + } + + public String getOfficialEmail() + { + return officialEmail; + } + + public void setOfficialEmail(String officialEmail) + { + this.officialEmail = officialEmail; + } + + public String getPrivateEmail() + { + return privateEmail; + } + + public void setPrivateEmail(String privateEmail) + { + this.privateEmail = privateEmail; + } + + public Boolean getSignedUpForCourse() + { + return isSignedUpForCourse; + } + + public void setSignedUpForCourse(Boolean signedUpForCourse) + { + isSignedUpForCourse = signedUpForCourse; + } +} diff --git a/src/main/classes/Course.java b/src/main/classes/Course.java new file mode 100644 index 0000000000000000000000000000000000000000..d44236f44f0b9ced8b8b95517bf8e971c323ea17 --- /dev/null +++ b/src/main/classes/Course.java @@ -0,0 +1,154 @@ +package classes; + +import jakarta.persistence.*; +import java.util.Objects; + +@Entity +@Table(name = "Kurs") +public class Course +{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + private int id; + + @Column(name = "Name") + private String name; + + @Column(name = "Semester") + private int semester; + + @Column(name = "Typ") + private String courseType; + + @Column(name = "SWS") + private int sws; + + @Column(name = "ECTS") + private double ects; + + @Column(name = "Prüfungstyp") + private String examType; + + @Column(name = "Anrechnung") + private Boolean isCredited; + + @ManyToOne(fetch = FetchType.LAZY) + private CoursesOfStudy coursesOfStudy; + + public Course() + { + + } + + public Course(String name, int semester, String courseType, int sws, double ects, String examType, Boolean isCredited) + { + this.name = name; + this.semester = semester; + this.courseType = courseType; + this.sws = sws; + this.ects = ects; + this.examType = examType; + this.isCredited = isCredited; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Course course = (Course) o; + return id == course.id; + } + + @Override + public int hashCode() + { + return Objects.hash(id); + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public int getSemester() + { + return semester; + } + + public void setSemester(int semester) + { + this.semester = semester; + } + + public String getCourseType() + { + return courseType; + } + + public void setCourseType(String courseType) + { + this.courseType = courseType; + } + + public int getSws() + { + return sws; + } + + public void setSws(int sws) + { + this.sws = sws; + } + + public double getEcts() + { + return ects; + } + + public void setEcts(double ects) + { + this.ects = ects; + } + + public String getExamType() + { + return examType; + } + + public void setExamType(String examType) + { + this.examType = examType; + } + + public Boolean isCredited() + { + return isCredited; + } + + public void setCredited(Boolean credited) + { + isCredited = credited; + } + + public void setCoursesOfStudy(CoursesOfStudy coursesOfStudy) + { + this.coursesOfStudy = coursesOfStudy; + } +} diff --git a/src/main/classes/CoursesOfStudy.java b/src/main/classes/CoursesOfStudy.java new file mode 100644 index 0000000000000000000000000000000000000000..5d160765897cd856aa85479431b985f4b8b2b905 --- /dev/null +++ b/src/main/classes/CoursesOfStudy.java @@ -0,0 +1,153 @@ +package classes; + +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "Studiengang") +public class CoursesOfStudy +{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + private int id; + + @Column(name = "Name") + private String name; + + @Column(name = "Abschluss") + private String degree; + + @Column(name = "Dauer") + private int duration; + + @Column(name = "Studiengebühr") + private int fees; + + @Column(name = "Schwerpunkt") + private String fieldOfStudy; + + @OneToMany( + mappedBy = "coursesOfStudy", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List<Course> courses = new ArrayList<>(); + @ManyToOne + @JoinColumn(name = "courses_of_study_id") + private CoursesOfStudy coursesOfStudy; + + public CoursesOfStudy getCoursesOfStudy() { + return coursesOfStudy; + } + + /* + @ManyToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "courses_of_study_id") + private CoursesOfStudy coursesOfStudy; + */ + + public CoursesOfStudy() + { + + } + + public CoursesOfStudy(String name, String degree, int duration, int fees, String fieldOfStudy) + { + this.name = name; + this.degree = degree; + this.duration = duration; + this.fees = fees; + this.fieldOfStudy = fieldOfStudy; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CoursesOfStudy that = (CoursesOfStudy) o; + return id == that.id; + } + + @Override + public int hashCode() + { + return Objects.hash(id); + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDegree() + { + return degree; + } + + public void setDegree(String degree) + { + this.degree = degree; + } + + public int getDuration() + { + return duration; + } + + public void setDuration(int duration) + { + this.duration = duration; + } + + public int getFees() + { + return fees; + } + + public void setFees(int fees) + { + this.fees = fees; + } + + public String getFieldOfStudy() + { + return fieldOfStudy; + } + + public void setFieldOfStudy(String fieldOfStudy) + { + this.fieldOfStudy = fieldOfStudy; + } + + public void addCourse(Course course) + { + courses.add(course); + course.setCoursesOfStudy(this); + } + + public void removeCourse(Course course) + { + courses.remove(course); + course.setCoursesOfStudy(null); + } +} diff --git a/src/main/classes/Enrollment.java b/src/main/classes/Enrollment.java new file mode 100644 index 0000000000000000000000000000000000000000..64f7c8911f6d1ab096459f8df4ad79ebe533e21a --- /dev/null +++ b/src/main/classes/Enrollment.java @@ -0,0 +1,96 @@ +package classes; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Entity +@Table(name = "Kursanmeldung") +public class Enrollment +{ + @Id + @Column(name = "ID") + private int id; + + @ManyToOne + @JoinColumn(name = "Matrikelnummer") + Student student; + + @ManyToOne + @JoinColumn(name = "Kursnummer") + Course course; + + @Column(name = "Datum der Anmeldung") + private LocalDateTime enrollmentDate; + + @Column(name = "Note") + private double grade; + + public Enrollment() + { + + } + + public Enrollment(Student student, Course course, LocalDateTime enrollmentDate) + { + this.student = student; + this.course = course; + this.enrollmentDate = enrollmentDate; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Enrollment that = (Enrollment) o; + return student == that.student && course == that.course; + } + + @Override + public int hashCode() + { + return Objects.hash(student, course); + } + + public Student getStudent() + { + return student; + } + + public void setStudent(Student student) + { + this.student = student; + } + + public Course getCourse() + { + return course; + } + + public void setCourse(Course course) + { + this.course = course; + } + + public LocalDateTime getEnrollmentDate() + { + return enrollmentDate; + } + + public void setEnrollmentDate(LocalDateTime enrollmentDate) + { + this.enrollmentDate = enrollmentDate; + } + + public double getGrade() + { + return grade; + } + + public void setGrade(double grade) + { + this.grade = grade; + } +} diff --git a/src/main/classes/Lecturer.java b/src/main/classes/Lecturer.java new file mode 100644 index 0000000000000000000000000000000000000000..f067a1f2be916338d44b495753cdc8b66b23242d --- /dev/null +++ b/src/main/classes/Lecturer.java @@ -0,0 +1,37 @@ +package classes; + +import abstractClasses.UniversityMember; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +@Entity +@Table(name = "Dozent") +public class Lecturer extends UniversityMember +{ + @Column(name = "Fakultaet") + String faculty; + + public Lecturer() + { + + } + + public Lecturer(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace, + String officialEmail, String privateEmail, Boolean isSignedUpForCourse, String faculty) + { + super(id, gender, firstName, lastName, placeOfResidence, birthPlace, + officialEmail, privateEmail, isSignedUpForCourse); + this.faculty = faculty; + } + + public String getFaculty() + { + return faculty; + } + + public void setFaculty(String faculty) + { + this.faculty = faculty; + } +} diff --git a/src/main/classes/Student.java b/src/main/classes/Student.java new file mode 100644 index 0000000000000000000000000000000000000000..e3f3775430b019fd01f95f694217024748d20040 --- /dev/null +++ b/src/main/classes/Student.java @@ -0,0 +1,82 @@ +package classes; + +import abstractClasses.UniversityMember; +import interfaces.Calculable; +import jakarta.persistence.*; + +import java.util.Set; + +@Entity +@Table(name = "Student") +public class Student extends UniversityMember implements Calculable +{ + @Column(name = "Status") + private String status; + + @Column(name = "Gebühren bezahlt") + private boolean paidFees; + + @Column(name = "Semester") + private int semester; + + @OneToMany(mappedBy = "student") + Set<Enrollment> enrollments; + + public Student() + { + + } + + public Student(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace, + String officialEmail, String privateEmail, Boolean isSignedUpForCourse, String status, + boolean paidFess, int semester) + { + super(id, gender, firstName, lastName, placeOfResidence, birthPlace, + officialEmail, privateEmail, isSignedUpForCourse); + this.status = status; + this.paidFees = paidFess; + this.semester = semester; + } + + @Override + public double calculateAverage() + { + return 0; + } + + @Override + public int calculateMedian() + { + return 0; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isPaidFees() + { + return paidFees; + } + + public void setPaidFees(boolean paidFees) + { + this.paidFees = paidFees; + } + + public int getSemester() + { + return semester; + } + + public void setSemester(int semester) + { + this.semester = semester; + } +} \ No newline at end of file diff --git a/src/main/enumeration/CourseType.java b/src/main/enumeration/CourseType.java new file mode 100644 index 0000000000000000000000000000000000000000..a38e51e4630f464eca70ec43d2c04c166519cfe1 --- /dev/null +++ b/src/main/enumeration/CourseType.java @@ -0,0 +1,22 @@ +package enumeration; + +public enum CourseType +{ + COMPULSORY("FWP"), + ELECTIVE("AWP"), + PLV("PLV"), + REQUIRED("Required"), + VOLUNTARY("Voluntary"); + + private String courseType; + + private CourseType(String courseType) + { + this.courseType = courseType; + } + + public String getCourseType() + { + return courseType; + } +} diff --git a/src/main/enumeration/Degree.java b/src/main/enumeration/Degree.java new file mode 100644 index 0000000000000000000000000000000000000000..6325147084e0970b864f707292fbfbfc0ed1a985 --- /dev/null +++ b/src/main/enumeration/Degree.java @@ -0,0 +1,23 @@ +package enumeration; + +public enum Degree +{ + BACHELOR_OF_ARTS("B.A."), + BACHELOR_OF_ENGINEERING("B.Eng."), + BACHELOR_OF_SCIENCE("B.Sc."), + MASTER_OF_ARTS("M.A."), + MASTER_OF_ENGINEERING("M.Eng."), + MASTER_OF_SCIENCE("M.Sc."); + + private String degree; + + private Degree(String degree) + { + this.degree = degree; + } + + public String getDegree() + { + return degree; + } +} diff --git a/src/main/enumeration/ExamType.java b/src/main/enumeration/ExamType.java new file mode 100644 index 0000000000000000000000000000000000000000..13627e62f3d6c7b7e323e57e327077e5ad63c7ad --- /dev/null +++ b/src/main/enumeration/ExamType.java @@ -0,0 +1,25 @@ +package enumeration; + +public enum ExamType +{ + BACHELOR_THESIS("BA"), + INTERNSHIP("Pr"), + MASTER_THESIS("MA"), + ORAL("mdlP"), + PERFORMANCE_RECORD("LN"), + PROOF_OF_PARTICIPATION("TN"), + RESEARCH_PROJECT("PStA"), + WRITTEN("schrP"); + + private String examType; + + private ExamType(String examType) + { + this.examType = examType; + } + + public String getExamType() + { + return examType; + } +} diff --git a/src/main/enumeration/FieldOfStudy.java b/src/main/enumeration/FieldOfStudy.java new file mode 100644 index 0000000000000000000000000000000000000000..c24baf737c395f9f8f140f0236c995d8387c9f10 --- /dev/null +++ b/src/main/enumeration/FieldOfStudy.java @@ -0,0 +1,19 @@ +package enumeration; + +public enum FieldOfStudy +{ + B_ACS_EMBEDDED_SYSTEMS("Embedded Systems"), + B_ACS_MOBILE_AND_SPATIAL_SYSTEMS("Mobile and Spatial Systems"); + + private String fieldOfStudy; + + private FieldOfStudy(String fieldOfStudy) + { + this.fieldOfStudy = fieldOfStudy; + } + + public String getFieldOfStudy() + { + return fieldOfStudy; + } +} diff --git a/src/main/enumeration/Gender.java b/src/main/enumeration/Gender.java new file mode 100644 index 0000000000000000000000000000000000000000..6ff2250cbd5356250a0ce59a405be26ca23a1a9a --- /dev/null +++ b/src/main/enumeration/Gender.java @@ -0,0 +1,20 @@ +package enumeration; + +public enum Gender +{ + MALE("Male"), + FEMALE("Female"), + OTHER("Other"); + + private String gender; + + private Gender(String gender) + { + this.gender = gender; + } + + public String getGender() + { + return gender; + } +} diff --git a/src/main/enumeration/Mark.java b/src/main/enumeration/Mark.java new file mode 100644 index 0000000000000000000000000000000000000000..677a033fa2007a84b00ced4e11ffb9d4449c50d5 --- /dev/null +++ b/src/main/enumeration/Mark.java @@ -0,0 +1,30 @@ +package enumeration; + +public enum Mark +{ + EINS_NULL(1.0), + EINS_DREI(1.3), + EINS_SIEBEN(1.7), + ZWEI_NULL(2.0), + ZWEI_DREI(2.3), + ZWEI_SIEBEN(2.7), + DREI_NULL(3.0), + DREI_DREI(3.3), + DREI_SIEBEN(3.7), + VIER_NULL(4.0), + FUENF_NULL(5.0), + SECHS_NULL(6.0), + SIEBEN_NULL(7.0); + + private double mark; + + Mark(double mark) + { + this.mark = mark; + } + + public double getMark() + { + return mark; + } +} diff --git a/src/main/enumeration/Semester.java b/src/main/enumeration/Semester.java new file mode 100644 index 0000000000000000000000000000000000000000..864f22a346fff34e9e2ce3e95ffe6124d7cea735 --- /dev/null +++ b/src/main/enumeration/Semester.java @@ -0,0 +1,31 @@ +package enumeration; + +public enum Semester +{ + FIRST(1), + SECOND(2), + THIRD(3), // Regelstudienzeit Master + FOURTH(4), + FIFTH(5), // Erstmaliges Ablegen der Masterarbeit; nur ein weiterer Versuch erlaubt + SIXTH(6), // max. Anzahl an Master-Semester; bis hier: ohne Corona + SEVENTH(7), // Regelstudienzeit Bachelor // M: WS 2021/22 + EIGHTH(8), // M: SS 2021 + NINTH(9), // Erstmaliges Ablegen der Bachelorarbeit; nur ein weiterer Versuch erlaubt // M: WS 2020/21 + TENTH(10), // max. Anzahl an Bachelor-Semester; bis hier: ohne Corona // M: vor und zum SS 2020 + ELEVENTH(11), // B: WS 2021/22 + TWELFTH(12), // B: SS 2021 + THIRTEENTH(13), // B: WS 2020/21 + FOURTEENTH(14); // B: vor und zum SS 2020 + + private final int semester; + + private Semester(final int semester) + { + this.semester = semester; + } + + public int getSemester() + { + return semester; + } +} diff --git a/src/main/enumeration/Status.java b/src/main/enumeration/Status.java new file mode 100644 index 0000000000000000000000000000000000000000..a56370cd8b802ec3573d91f77dc239274fee81b9 --- /dev/null +++ b/src/main/enumeration/Status.java @@ -0,0 +1,20 @@ +package enumeration; + +public enum Status +{ + ENROLLED("Enrolled"), + WITHDRAWAL("Withdrawing"), + DISMISSAL("Dismissed"); + + private String status; + + private Status(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } +} diff --git a/src/main/interfaces/Calculable.java b/src/main/interfaces/Calculable.java new file mode 100644 index 0000000000000000000000000000000000000000..e49ea804341396b0a478ec3b98855ade8e059ca8 --- /dev/null +++ b/src/main/interfaces/Calculable.java @@ -0,0 +1,7 @@ +package interfaces; + +public interface Calculable +{ + double calculateAverage(); + int calculateMedian(); +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..1593f7f5fbdc503a774fa8db817a57b499f52b28 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,14 @@ +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" + version="2.0"> + <persistence-unit name="jpa-hibernate-notenmanager" transaction-type="RESOURCE_LOCAL"> + <properties> + <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/notenmanager"/> + <property name="jakarta.persistence.jdbc.user" value="root"/> + <property name="jakarta.persistence.jdbc.password" value=""/> + <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/> + </properties> + </persistence-unit> +</persistence> +