trohr / sample-shop-oracle

Simple Shop Application based on Oracle DB

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2RELA: Project: Tomáš Rohrbacher (R15425)

Projekt řešen jako jednoduchý prodejní systém.

Prodejni funkce:

  • Nabídka produktů
  • Vložení do košíku
  • Vytvoření objednávky
  • ‚Fake‘ platba objednávky
  • Zobrazení faktury

Funkce 'backoffice':

  • Správa produktů (CRUD)
  • Správa objednávek (CRUD)
  • Přehled objednávek (různé pohledy)

Nástin technického řešení:

  • Řešeno pomocí frameworku spring-boot [1] za pomocí templatovacího engine thymeleaf [2].
  • Přístup k DB je řešen pomocí JDBC ovladače pro oracle 'ojdbc6.jar' (Oracle JDBC [3])
  • ORM řešeno pomocí spring-boot-starter-data-jpa balíčku
  • jako implementace ORM použit Eclipse Link JPA (TODO ref). Eclipse Link JPA totiž umí vhodně mapovat oracle objektové struktury do Java.
  • Oracle Databáze je manuálně inicializována DDL skriptem a naplněna iniciálními daty.
  • Projekt je rozdělen na dva submoduly (jeden pro jádro, druhý pro webovou aplikaci). Definice buildu je řešena v Gradle (viz build.gradle) jako multi-module build.

Zadání

Navrhněte konceptuální model s minimálně 10 entitami, se složenými, vícehodnotovými a odvoditelnými atributy.

Transformujte tento model na objektově relační datový model s tím, že odvoditelné atributy budou implementovány jako metody datového typu objekt, vygenerujte schéma do Oracle.

Vytvořte minimálně tři triggery pro hlídání doménové a referenční integrity.

Napište minimálně tři procedury či funkce, které budou v rámci aplikace spouštěny a budou řešit vámi navrženou funkcionalitu. Procedury, resp. funkce napište v jazyce PL/SQL.

Navrhněte databázovou aplikaci, která bude řešit minimálně tyto funkcionality:

  • vkládání dat (včetně vkládání dat do složených a vícehodnotových atributů)
  • aktualizace dat (včetně aktualizace dat ve složených a vícehodnotových atributech)
  • mazání dat
  • procedury, resp. funkce
  • minimálně deset dotazů (projekce, selekce, spojení, kvantifikace, množinové operátory ALL, ANY, IN, seskupení, negace existenčního kvantifikátoru, dotazy na strukturované atributy - ADT včetně kolekcí).

Spuštění

Spustit běh aplikace ve vývojovém prostředí lze pomocí příkazu

./gradlew bootRun

Produkční běh je pomocí uber-jar.

./gradlew build && java -jar shop-webapp/build/libs/shop-allinone-webapp-0.0.1-SNAPSHOT.jar

Integrace s DB a JPA

Pro tento úkol využíváme paměťovou DB H2 a JPA integraci pomocí spring-data. Postupuji dle návodů na Internetu:

Integrace do spring-boot projektu je velice jednoduchá:

IN MEMORY DATABASE

Abychom spustili paměťovou databázi, stačí vložit závislost na knihovně dané paměťové DB do definice dependencies v souboru build.gradle. Spring-boot automaticky rozpozná, že se jedná o testovací DB. (Zde používáme H2, lze také použít další paměťové DB: HSQLDB nebo DERBY).

compile "com.h2database:h2"

Jelikož chci vidět do obsahu databáze, tak přímo do hlavní části aplikace vložím servlet pro správu H2 DB. (Viz metodu h2servletRegistration() ve třídě KU2Application.java.) Konzole H2 DB je pak dostupná na adrese:

http://localhost:8080/console/

SPRING-DATA

Při použití projektu spring-data nemusíme specifikovat klasický persistence.xml soubor. Nastavení na DB se děje pomocí klasických konfiguračních souborů. Takové soubory mohou být typu java properties yaml a jiných a boot je správně přečte a PersistenceContext nastaví. My jsme žádné parametry zatím nanastavili, tak se používá default paměťová DB a její default parametry.

Pro přístup k datům stačí vytvořit anotovanou entity třídu (klasická JPA @Entity) a pro ni rozhraní vzoru Repository. Nemusíme psát implementaci, používat EntityManager, ap.: stačí podědit spring-data CrudRepository:

public interface ProductDefinitionRepository extends PagingAndSortingRepository<ProductDefinitionJpa, Long>
{
	List<ProductDefinitionJpa> findProductByName(String name);
	List<ProductDefinitionJpa> findProductByName(String name, Sort sort);
}

Implementaci takové třídy poskytne spring-data, nám stačí si tuto třídu nechat nainjektovat pomocí IoC a volat metody pro persistenci či zjištění dat.

Eclipse Link JPA provider

Pro plnou integraci JPA s Oracle objektovymi typy je nutne pouzit Eclipse-link.

Postupováno dle návodu: https://www.baeldung.com/spring-eclipselink

Vygenerování JPA entit

Kod JPA anotovaných tříd vygenerován na základě zavedených tabulek v D Oracle 11g za pomocí IDE Eclipse.

Volání uložených procedur z Java

Modularizace zdrojového kódu (Gradle)

Rozdělení na projekty: jeden pro práci s DB (shop-allinone-core) a jeden pro prezentaci na web (shop-allinone-webapp).

Definice buildu je řešena v Gradle jako multi-module build. (Viz settings.gradle a build.gradle)

include 'shop-allinone-core'
include 'shop-allinone-webapp'

Plný název podmodulů odpovídá 'artifactId' (tedy ve tvaru 'shop-allinone-<submodule>').

Zdrojové soubory k podprojektům jsou uvnitř adresářové struktury odkazovány zkráceným názvem a jsou tedy umístěny v podadresářích './<submodule>'.

Instrukce ke konfiguraci Gradle multi-modulových projektů lze najít v návodu pro Gradle [6].

Další reference:

Deklarované závislosti

  • shop-allinone-core:

      // Spring-boot DATA + JPA + JDBC + AOP support
      compile "org.springframework.boot:spring-boot-starter-data-jpa"
    
  • shop-allinone-webapp:

      // ZAVISLOST NA VNITRNI KNIHOVNE _CORE_
      compile project(':shop-allinone-core') 
      
      // Spring boot WEB
      compile "org.springframework.boot:spring-boot-starter-web"
      // TEMPLATING ENGINE
      compile "org.springframework.boot:spring-boot-starter-thymeleaf"
      
      // SPRING-DATA + JPA support
      compile "org.springframework.boot:spring-boot-starter-data-jpa"
      
      // Concrete DB support
      // INFO: Toto by nikdy neměla být závislost reálného projektu, ale nyní to použijme:
      compile "com.h2database:h2"
    

Definice verzí knihoven

Nechceme specifikovat verze vsech pouzitych a zavislych knihoven sami, tedy použijeme techniku známou z maven, tzv. import BOM (Bill of Material) balíčku.

Tato technika nám dovolí specifikovat verze použitých knihoven pro balík knihoven najednou, tedy se spolehnout na provázanost knihoven, která je odladěna, a je ověřeno, že poskytují požadovanou a dokumentovanou funkcionalitu.

	// Dependency Management which allows to import the Maven BOM dependencies
	// https://github.com/spring-gradle-plugins/dependency-management-plugin
	apply plugin: 'io.spring.dependency-management'

My v našem projektu budeme používat závislosti, které jsou implicitní pro Spring-Boot verze 1.5.7.RELEASE, naimportujeme tedy knihovnu org.springframework.boot:spring-boot-dependencies:1.5.7.RELEASE.

	// Inklucujeme verze zavislosti, ktere pouziva spring-boot
	// (nemusime je pak explicitne specifikovat)
	// Funkcionalitu dodava gradle plugin 'io.spring.dependency-management'
	dependencyManagement {
		imports {
			mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
		}
	}

Reference

About

Simple Shop Application based on Oracle DB

License:GNU General Public License v3.0


Languages

Language:Java 72.6%Language:HTML 18.3%Language:PLSQL 8.6%Language:CSS 0.5%