[{"data":1,"prerenderedAt":287},["ShallowReactive",2],{"slug-content-en-\u002Feducation\u002Fihk-ausbildung":3},{"kind":4,"item":5,"categories":37,"projects":199},"education",{"id":6,"title":7,"body":8,"dateEnd":15,"dateStart":16,"degree":17,"description":12,"extension":18,"fieldOfStudy":19,"highlights":20,"institution":23,"meta":24,"navigation":25,"path":26,"projects":27,"seo":29,"stem":30,"tags":31,"__hash__":36},"education_en\u002Feducation\u002Fihk-ausbildung.md","Ihk Ausbildung",{"type":9,"value":10,"toc":11},"minimark",[],{"title":12,"searchDepth":13,"depth":13,"links":14},"",2,[],"2022-06","2020-08","IT Specialist for Application Development","md",null,[21,22],"Vocational school grade: 1.5","IHK grade: 2.0","IHK Nord Westfalen",{},true,"\u002Feducation\u002Fihk-ausbildung",[28],"kinoBE",{"description":12},"education\u002Fihk-ausbildung",[32,33,34,35],"java","networking","sql","windows","L9JJ4fzSjtTo9ImKLZ0jYqwSba8XQ9m2jIHbuRvCsSg",[38,46,67,94,124,136,147,155],{"name":39,"items":40},"Databases",[41,43],{"slug":34,"name":42},"SQL (MySQL, MariaDB)",{"slug":44,"name":45},"sqlite","SQLite",{"name":47,"items":48},"Frontend",[49,52,55,58,61,64],{"slug":50,"name":51},"html5","HTML5",{"slug":53,"name":54},"css3","CSS3",{"slug":56,"name":57},"tailwindcss","Tailwind CSS",{"slug":59,"name":60},"bootstrap","Bootstrap",{"slug":62,"name":63},"uikit","UIkit",{"slug":65,"name":66},"extjs","Ext JS",{"name":68,"items":69},"JavaScript Ecosystem",[70,73,76,79,82,85,88,91],{"slug":71,"name":72},"javascript","JavaScript",{"slug":74,"name":75},"typescript","TypeScript",{"slug":77,"name":78},"nodejs","Node.js",{"slug":80,"name":81},"vuejs","Vue.js",{"slug":83,"name":84},"nuxt","Nuxt.JS",{"slug":86,"name":87},"react","React",{"slug":89,"name":90},"next","Next.JS",{"slug":92,"name":93},"deno","Deno",{"name":95,"items":96},"PHP Ecosystem",[97,100,103,106,109,112,115,118,121],{"slug":98,"name":99},"php","PHP",{"slug":101,"name":102},"laravel","Laravel",{"slug":104,"name":105},"symfony","Symfony",{"slug":107,"name":108},"laminas","Laminas",{"slug":110,"name":111},"mezzio","Mezzio",{"slug":113,"name":114},"zend","Zend Framework",{"slug":116,"name":117},"wordpress","WordPress",{"slug":119,"name":120},"shopware","Shopware",{"slug":122,"name":123},"spryker","Spryker",{"name":125,"items":126},"Mobile",[127,130,133],{"slug":128,"name":129},"dart","Dart",{"slug":131,"name":132},"flutter","Flutter",{"slug":134,"name":135},"android","Android",{"name":137,"items":138},"Other Languages",[139,141,144],{"slug":32,"name":140},"Java",{"slug":142,"name":143},"python","Python",{"slug":145,"name":146},"go","Go",{"name":148,"items":149},"Operating Systems",[150,153],{"slug":151,"name":152},"linux","Linux",{"slug":35,"name":154},"Windows",{"name":156,"items":157},"Other",[158,161,164,167,170,173,176,179,182,184,187,190,193,196],{"slug":159,"name":160},"git","Git",{"slug":162,"name":163},"docker","Docker",{"slug":165,"name":166},"jenkins","Jenkins",{"slug":168,"name":169},"jvm","JVM",{"slug":171,"name":172},"aws","AWS",{"slug":174,"name":175},"cloudflare","Cloudflare",{"slug":177,"name":178},"nginx","Nginx",{"slug":180,"name":181},"redis","Redis",{"slug":33,"name":183},"Networking",{"slug":185,"name":186},"rabbitmq","RabbitMQ",{"slug":188,"name":189},"oidc","OIDC",{"slug":191,"name":192},"rest","REST",{"slug":194,"name":195},"terraform","Terraform",{"slug":197,"name":198},"cicd","CI\u002FCD",[200],{"id":201,"title":28,"body":202,"dateEnd":276,"dateStart":277,"description":278,"extension":18,"featuredInCv":279,"link":19,"meta":280,"navigation":25,"path":281,"repo":282,"seo":283,"stem":284,"tags":285,"__hash__":286},"projects_en\u002Fprojects\u002Fkinobe.md",{"type":9,"value":203,"toc":273},[204,209,213,236,239,270],[205,206,208],"h2",{"id":207},"about-the-project","About the Project",[210,211,212],"p",{},"kinoBE (\"Kino Backend\") is the server side of a cinema booking system I built during my IHK vocational training. The centerpiece of the project is a small, hand-written ORM that I implemented from scratch to understand how frameworks like Doctrine or Hibernate map objects to a relational database internally.",[210,214,215,216,220,221,224,225,228,229,224,232,235],{},"Entities are plain Java classes annotated with a custom ",[217,218,219],"code",{},"@Entity",", ",[217,222,223],{},"@Column"," and ",[217,226,227],{},"@Id",", while ",[217,230,231],{},"@OneToManyRelation",[217,233,234],{},"@ManyToOneRelation"," describe the associations between them. At runtime the ORM resolves these annotations via reflection to build SQL, hydrate objects from result sets, and load related entities through their repositories.",[210,237,238],{},"On top of that it reimplements several patterns found in production ORMs:",[240,241,242,260,263],"ul",{},[243,244,245,246,249,250,220,253,224,256,259],"li",{},"a repository layer (",[217,247,248],{},"AbstractRepository\u003CT>",") providing ",[217,251,252],{},"findAll",[217,254,255],{},"findBy",[217,257,258],{},"getById",",",[243,261,262],{},"an identity map that caches already-loaded entities to avoid duplicate objects and redundant queries,",[243,264,265,266,269],{},"and rudimentary dirty checking, where each entity remembers its initial state via a hash so that ",[217,267,268],{},"flush()"," only persists records that actually changed.",[210,271,272],{},"The data is stored in SQLite through JDBC, and the application exposes a REST API (movies, presentations, reservations) for the matching frontend. The build is handled by Maven with a GitHub Actions workflow.",{"title":12,"searchDepth":13,"depth":13,"links":274},[275],{"id":207,"depth":13,"text":208},"2022-03","2022-02","A hand-written, annotation-driven ORM and REST backend for a cinema booking system, built during my IHK training.",false,{},"\u002Fprojects\u002Fkinobe","https:\u002F\u002Fgithub.com\u002FLinusTebbe\u002FkinoBE",{"title":28,"description":278},"projects\u002Fkinobe",[32,44,34,191,159,197],"makcFqLv9tjZh8sc7oOzE6WF77BMBfUxXq7igkZf6r8",1783417754892]