[{"data":1,"prerenderedAt":1131},["ShallowReactive",2],{"docs-navigation:\u002Fdocs\u002Fmodules\u002Fvital-core\u002Frepositories":3,"docs-page-estimated-read-time:\u002Fdocs\u002Fmodules\u002Fvital-core\u002Frepositories":399,"docs-page:\u002Fdocs\u002Fmodules\u002Fvital-core\u002Frepositories":400},[4,9,41,69,282],{"title":5,"path":6,"stem":7,"icon":8},"Welcome to the Vital docs","\u002Fdocs\u002Fabout","docs\u002F1.about","i-lucide-info",{"title":10,"path":11,"stem":12,"children":13,"icon":40},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F2.getting-started\u002F1.index",[14,16,35],{"title":15,"path":11,"stem":12,"icon":8},"What is Vital?",{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":34},"Installation","i-lucide-download","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F2.getting-started\u002F1.installation",[22,26,30],{"title":23,"path":24,"stem":25},"Using a starter project (~5 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fstarter","docs\u002F2.getting-started\u002F1.installation\u002F2.starter",{"title":27,"path":28,"stem":29},"Manual configuration (~7-8 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fmanual","docs\u002F2.getting-started\u002F1.installation\u002F3.manual",{"title":31,"path":32,"stem":33},"Using the initializer (~2-3 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Finitializer","docs\u002F2.getting-started\u002F1.installation\u002F4.initializer",false,{"title":36,"path":37,"stem":38,"icon":39},"Main class","\u002Fdocs\u002Fgetting-started\u002Fmain-plugin-class","docs\u002F2.getting-started\u002F2.main-plugin-class","i-lucide-play","i-lucide-circle-play",{"title":42,"path":43,"stem":44,"children":45,"icon":68},"Conventions","\u002Fdocs\u002Fconventions","docs\u002F3.conventions\u002F1.index",[46,48,52,56,60,64],{"title":47,"path":43,"stem":44,"icon":8},"About",{"title":49,"path":50,"stem":51},"Spring","\u002Fdocs\u002Fconventions\u002Fspring","docs\u002F3.conventions\u002F2.spring",{"title":53,"path":54,"stem":55},"Platforms","\u002Fdocs\u002Fconventions\u002Fplatform-implementations","docs\u002F3.conventions\u002F3.platform-implementations",{"title":57,"path":58,"stem":59},"Metadata","\u002Fdocs\u002Fconventions\u002Fmetadata","docs\u002F3.conventions\u002F4.metadata",{"title":61,"path":62,"stem":63},"Lifecycles","\u002Fdocs\u002Fconventions\u002Flifecycles","docs\u002F3.conventions\u002F5.lifecycles",{"title":65,"path":66,"stem":67},"(Optional) Advanced class loading","\u002Fdocs\u002Fconventions\u002Fadvanced-classloading","docs\u002F3.conventions\u002F6.advanced-classloading","i-lucide-cog",{"title":70,"path":71,"stem":72,"children":73,"icon":281},"Modules","\u002Fdocs\u002Fmodules","docs\u002F4.modules\u002F1.index",[74,76,100,106,112,126,136,150,164,178,188,224,234,248,257,275],{"title":75,"path":71,"stem":72,"icon":8},"What are modules?",{"title":77,"path":78,"stem":79,"children":80,"icon":99},"vital-core","\u002Fdocs\u002Fmodules\u002Fvital-core","docs\u002F4.modules\u002F2.vital-core\u002F1.index",[81,83,87,91,95],{"title":82,"path":78,"stem":79,"icon":8},"About this module",{"title":84,"path":85,"stem":86},"Configuration","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Fconfiguration","docs\u002F4.modules\u002F2.vital-core\u002F2.configuration",{"title":88,"path":89,"stem":90},"Listeners","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Flisteners","docs\u002F4.modules\u002F2.vital-core\u002F3.listeners",{"title":92,"path":93,"stem":94},"Conditional beans","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Fconditional-beans","docs\u002F4.modules\u002F2.vital-core\u002F4.conditional-beans",{"title":96,"path":97,"stem":98},"Repositories","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Frepositories","docs\u002F4.modules\u002F2.vital-core\u002F5.repositories","",{"title":101,"path":102,"stem":103,"children":104,"icon":99},"vital-cloudnet4-bridge","\u002Fdocs\u002Fmodules\u002Fvital-cloudnet4-bridge","docs\u002F4.modules\u002Fvital-cloudnet4-bridge\u002F1.index",[105],{"title":82,"path":102,"stem":103,"icon":8},{"title":107,"path":108,"stem":109,"children":110,"icon":99},"vital-cloudnet4-driver","\u002Fdocs\u002Fmodules\u002Fvital-cloudnet4-driver","docs\u002F4.modules\u002Fvital-cloudnet4-driver\u002F1.index",[111],{"title":82,"path":108,"stem":109,"icon":8},{"title":113,"path":114,"stem":115,"children":116,"icon":99},"vital-commands","\u002Fdocs\u002Fmodules\u002Fvital-commands","docs\u002F4.modules\u002Fvital-commands\u002F1.index",[117,118,122],{"title":82,"path":114,"stem":115,"icon":8},{"title":119,"path":120,"stem":121},"Commands","\u002Fdocs\u002Fmodules\u002Fvital-commands\u002Fcommands","docs\u002F4.modules\u002Fvital-commands\u002Fcommands",{"title":123,"path":124,"stem":125},"Exception handling","\u002Fdocs\u002Fmodules\u002Fvital-commands\u002Fexception-handling","docs\u002F4.modules\u002Fvital-commands\u002Fexception-handling",{"title":127,"path":128,"stem":129,"children":130,"icon":99},"vital-configs","\u002Fdocs\u002Fmodules\u002Fvital-configs","docs\u002F4.modules\u002Fvital-configs\u002F1.index",[131,132],{"title":82,"path":128,"stem":129,"icon":8},{"title":133,"path":134,"stem":135},"Configs","\u002Fdocs\u002Fmodules\u002Fvital-configs\u002Fconfigs","docs\u002F4.modules\u002Fvital-configs\u002F2.configs",{"title":137,"path":138,"stem":139,"children":140,"icon":99},"vital-holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F1.index",[141,142,146],{"title":82,"path":138,"stem":139,"icon":8},{"title":143,"path":144,"stem":145},"Global holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms\u002Fglobal-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F2.global-holograms",{"title":147,"path":148,"stem":149},"Player holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms\u002Fplayer-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F3.player-holograms",{"title":151,"path":152,"stem":153,"children":154,"icon":99},"vital-inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F1.index",[155,156,160],{"title":82,"path":152,"stem":153,"icon":8},{"title":157,"path":158,"stem":159},"Normal inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories\u002Fnormal-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F2.normal-inventories",{"title":161,"path":162,"stem":163},"Paged inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories\u002Fpaged-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F3.paged-inventories",{"title":165,"path":166,"stem":167,"children":168,"icon":99},"vital-items","\u002Fdocs\u002Fmodules\u002Fvital-items","docs\u002F4.modules\u002Fvital-items\u002F1.index",[169,170,174],{"title":82,"path":166,"stem":167,"icon":8},{"title":171,"path":172,"stem":173},"Items","\u002Fdocs\u002Fmodules\u002Fvital-items\u002Fitems","docs\u002F4.modules\u002Fvital-items\u002F2.items",{"title":175,"path":176,"stem":177},"Item builders","\u002Fdocs\u002Fmodules\u002Fvital-items\u002Fitem-builders","docs\u002F4.modules\u002Fvital-items\u002F3.item-builders",{"title":179,"path":180,"stem":181,"children":182,"icon":99},"vital-localization","\u002Fdocs\u002Fmodules\u002Fvital-localization","docs\u002F4.modules\u002Fvital-localization\u002F1.index",[183,184],{"title":82,"path":180,"stem":181,"icon":8},{"title":185,"path":186,"stem":187},"Localization","\u002Fdocs\u002Fmodules\u002Fvital-localization\u002Flocalization","docs\u002F4.modules\u002Fvital-localization\u002F2.localization",{"title":189,"path":190,"stem":191,"children":192,"icon":99},"vital-minigames","\u002Fdocs\u002Fmodules\u002Fvital-minigames","docs\u002F4.modules\u002Fvital-minigames\u002F1.index",[193,194,208],{"title":82,"path":190,"stem":191,"icon":8},{"title":195,"path":196,"stem":197,"children":198,"icon":99},"Global games","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F1.index",[199,200,204],{"title":47,"path":196,"stem":197,"icon":8},{"title":201,"path":202,"stem":203},"States","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games\u002Fstates","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F2.states",{"title":205,"path":206,"stem":207},"Countdown states","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games\u002Fcountdown-states","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F3.countdown-states",{"title":209,"path":210,"stem":211,"children":212,"icon":99},"Instanced games","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F1.index",[213,214,218,221],{"title":47,"path":210,"stem":211,"icon":8},{"title":215,"path":216,"stem":217},"Instances","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Finstances","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F2.instances",{"title":201,"path":219,"stem":220},"\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Fstates","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F3.states",{"title":205,"path":222,"stem":223},"\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Fcountdown-states","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F4.countdown-states",{"title":225,"path":226,"stem":227,"children":228,"icon":99},"vital-players","\u002Fdocs\u002Fmodules\u002Fvital-players","docs\u002F4.modules\u002Fvital-players\u002F1.index",[229,230],{"title":82,"path":226,"stem":227,"icon":8},{"title":231,"path":232,"stem":233},"Players","\u002Fdocs\u002Fmodules\u002Fvital-players\u002Fplayers","docs\u002F4.modules\u002Fvital-players\u002F2.players",{"title":235,"path":236,"stem":237,"children":238,"icon":99},"vital-scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002F1.index",[239,240,244],{"title":82,"path":236,"stem":237,"icon":8},{"title":241,"path":242,"stem":243},"Global scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards\u002Fglobal-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002Fglobal-scoreboards",{"title":245,"path":246,"stem":247},"Player scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards\u002Fplayer-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002Fplayer-scoreboards",{"title":249,"path":250,"stem":251,"children":252,"icon":99},"vital-statistics","\u002Fdocs\u002Fmodules\u002Fvital-statistics","docs\u002F4.modules\u002Fvital-statistics\u002F1.index",[253,254],{"title":82,"path":250,"stem":251,"icon":8},{"title":84,"path":255,"stem":256},"\u002Fdocs\u002Fmodules\u002Fvital-statistics\u002Fconfiguration","docs\u002F4.modules\u002Fvital-statistics\u002F2.configuration",{"title":258,"path":259,"stem":260,"children":261,"icon":99},"vital-tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F1.index",[262,263,267,271],{"title":82,"path":259,"stem":260,"icon":8},{"title":264,"path":265,"stem":266},"Repeatable tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Frepeatable-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F2.repeatable-tasks",{"title":268,"path":269,"stem":270},"Countdown tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Fcountdown-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F3.countdown-tasks",{"title":272,"path":273,"stem":274},"Scheduled tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Fscheduled-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F4.scheduled-tasks",{"title":276,"path":277,"stem":278,"children":279,"icon":99},"vital-utils (Also for non Vital projects)","\u002Fdocs\u002Fmodules\u002Fvital-utils","docs\u002F4.modules\u002Fvital-utils\u002F1.index",[280],{"title":82,"path":277,"stem":278,"icon":8},"i-lucide-package",{"title":283,"path":284,"stem":285,"children":286,"icon":398},"Recipes","\u002Fdocs\u002Frecipes","docs\u002F5.recipes\u002F1.index",[287,289,301,305,317,330,341,344,368,371,384],{"title":288,"path":284,"stem":285,"icon":8},"What are recipes?",{"title":119,"path":290,"stem":291,"children":292,"page":34},"\u002Fdocs\u002Frecipes\u002Fcommands","docs\u002F5.recipes\u002Fcommands",[293,297],{"title":294,"path":295,"stem":296},"Command with arg exception handler","\u002Fdocs\u002Frecipes\u002Fcommands\u002Fcommands","docs\u002F5.recipes\u002Fcommands\u002Fcommands",{"title":298,"path":299,"stem":300},"Global command exception handler","\u002Fdocs\u002Frecipes\u002Fcommands\u002Fglobal-exception-handler","docs\u002F5.recipes\u002Fcommands\u002Fglobal-exception-handler",{"title":302,"path":303,"stem":304},"Config","\u002Fdocs\u002Frecipes\u002Fconfig","docs\u002F5.recipes\u002Fconfig",{"title":306,"path":307,"stem":308,"children":309,"page":34},"Holograms","\u002Fdocs\u002Frecipes\u002Fholograms","docs\u002F5.recipes\u002Fholograms",[310,314],{"title":311,"path":312,"stem":313},"Global hologram","\u002Fdocs\u002Frecipes\u002Fholograms\u002Fglobal-holograms","docs\u002F5.recipes\u002Fholograms\u002Fglobal-holograms",{"title":147,"path":315,"stem":316},"\u002Fdocs\u002Frecipes\u002Fholograms\u002Fplayer-holograms","docs\u002F5.recipes\u002Fholograms\u002Fplayer-holograms",{"title":318,"path":319,"stem":320,"children":321,"page":34},"Inventories","\u002Fdocs\u002Frecipes\u002Finventories","docs\u002F5.recipes\u002Finventories",[322,326],{"title":323,"path":324,"stem":325},"Normal inventory","\u002Fdocs\u002Frecipes\u002Finventories\u002Fnormal-inventory","docs\u002F5.recipes\u002Finventories\u002Fnormal-inventory",{"title":327,"path":328,"stem":329},"Paged inventory","\u002Fdocs\u002Frecipes\u002Finventories\u002Fpaged-inventory","docs\u002F5.recipes\u002Finventories\u002Fpaged-inventory",{"title":171,"path":331,"stem":332,"children":333,"page":34},"\u002Fdocs\u002Frecipes\u002Fitems","docs\u002F5.recipes\u002Fitems",[334,338],{"title":335,"path":336,"stem":337},"Interactable items","\u002Fdocs\u002Frecipes\u002Fitems\u002Finteractable-items","docs\u002F5.recipes\u002Fitems\u002Finteractable-items",{"title":175,"path":339,"stem":340},"\u002Fdocs\u002Frecipes\u002Fitems\u002Fitem-builders","docs\u002F5.recipes\u002Fitems\u002Fitem-builders",{"title":185,"path":342,"stem":343},"\u002Fdocs\u002Frecipes\u002Flocalization","docs\u002F5.recipes\u002Flocalization",{"title":345,"path":346,"stem":347,"children":348,"page":34},"Minigames","\u002Fdocs\u002Frecipes\u002Fminigames","docs\u002F5.recipes\u002Fminigames",[349,353,357,361,365],{"title":350,"path":351,"stem":352},"Global minigame countdown states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Fglobal-countdown-states","docs\u002F5.recipes\u002Fminigames\u002Fglobal-countdown-states",{"title":354,"path":355,"stem":356},"Global minigame states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Fglobal-states","docs\u002F5.recipes\u002Fminigames\u002Fglobal-states",{"title":358,"path":359,"stem":360},"Instance countdown states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstance-countdown-states","docs\u002F5.recipes\u002Fminigames\u002Finstance-countdown-states",{"title":362,"path":363,"stem":364},"Instance states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstance-states","docs\u002F5.recipes\u002Fminigames\u002Finstance-states",{"title":215,"path":366,"stem":367},"\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstances","docs\u002F5.recipes\u002Fminigames\u002Finstances",{"title":231,"path":369,"stem":370},"\u002Fdocs\u002Frecipes\u002Fplayers","docs\u002F5.recipes\u002Fplayers",{"title":372,"path":373,"stem":374,"children":375,"page":34},"Scoreboards","\u002Fdocs\u002Frecipes\u002Fscoreboards","docs\u002F5.recipes\u002Fscoreboards",[376,380],{"title":377,"path":378,"stem":379},"Global scoreboard","\u002Fdocs\u002Frecipes\u002Fscoreboards\u002Fglobal-scoreboard","docs\u002F5.recipes\u002Fscoreboards\u002Fglobal-scoreboard",{"title":381,"path":382,"stem":383},"Player scoreboard","\u002Fdocs\u002Frecipes\u002Fscoreboards\u002Fplayer-scoreboard","docs\u002F5.recipes\u002Fscoreboards\u002Fplayer-scoreboard",{"title":385,"path":386,"stem":387,"children":388,"page":34},"Tasks","\u002Fdocs\u002Frecipes\u002Ftasks","docs\u002F5.recipes\u002Ftasks",[389,392,395],{"title":268,"path":390,"stem":391},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Fcountdown-tasks","docs\u002F5.recipes\u002Ftasks\u002Fcountdown-tasks",{"title":264,"path":393,"stem":394},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Frepeatable-tasks","docs\u002F5.recipes\u002Ftasks\u002Frepeatable-tasks",{"title":272,"path":396,"stem":397},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Fscheduled-tasks","docs\u002F5.recipes\u002Ftasks\u002Fscheduled-tasks","i-lucide-cooking-pot",4,{"id":401,"title":96,"body":402,"description":1124,"extension":1125,"meta":1126,"navigation":1127,"path":97,"rawbody":1128,"seo":1129,"stem":98,"__hash__":1130},"docs\u002Fdocs\u002F4.modules\u002F2.vital-core\u002F5.repositories.md",{"type":403,"value":404,"toc":1120},"minimark",[405,409,422,425,443,455,460,538,546,549,686,689,844,849,865,878,976,983,1008,1014,1045,1051,1072,1075,1116],[406,407,96],"h1",{"id":408},"repositories",[410,411,412,413,416,417,421],"p",{},"Sometimes you need to globally store some data that should be wiped when the server stops \u002F restarts.",[414,415],"br",{},"\nVital provides a class called ",[418,419,420],"code",{},"VitalRepository",", which can be used for exactly that.",[410,423,424],{},"The repository implementation is inspired by the Spring Boot repository solutions and uses similar syntaxes.",[410,426,427,428,431,432,434,435,438,439,442],{},"Essentially, a repository is nothing more than a class (instance) that stores a ",[418,429,430],{},"Map\u003CID, Entity>"," of all of your custom data entities.",[414,433],{},"\nA custom data entity may be a class that contains specific data for each entry, like ",[418,436,437],{},"MyCustomPlayer"," or ",[418,440,441],{},"MyCustomHologram",", etc.",[410,444,445,446,450,451,454],{},"Each entity ",[447,448,449],"strong",{},"must always be uniquely identifiable by some sort of ID","; a common approach to keep ids unique is to use a ",[418,452,453],{},"UUID",".",[410,456,457,458,454],{},"To make your own repository, create a class that extends from ",[418,459,420],{},[461,462,467],"pre",{"className":463,"code":464,"filename":465,"language":466,"meta":99,"style":99},"language-java shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F This annotation SHOULD be used so you can inject this repository into any other Spring bean (other @Component annotated methods, classes, etc.)\n@Component\npublic class MyRepository extends VitalRepository\u003CMyCustomEntity, UUID> {\n  \n}\n","MyRepository.java","java",[418,468,469,478,489,526,532],{"__ignoreMap":99},[470,471,474],"span",{"class":472,"line":473},"line",1,[470,475,477],{"class":476},"sutJx","\u002F\u002F This annotation SHOULD be used so you can inject this repository into any other Spring bean (other @Component annotated methods, classes, etc.)\n",[470,479,481,485],{"class":472,"line":480},2,[470,482,484],{"class":483},"sP7_E","@",[470,486,488],{"class":487},"sbsja","Component\n",[470,490,492,495,498,502,505,508,511,514,517,520,523],{"class":472,"line":491},3,[470,493,494],{"class":487},"public",[470,496,497],{"class":487}," class",[470,499,501],{"class":500},"sbgvK"," MyRepository",[470,503,504],{"class":487}," extends",[470,506,507],{"class":500}," VitalRepository",[470,509,510],{"class":483},"\u003C",[470,512,513],{"class":487},"MyCustomEntity",[470,515,516],{"class":483},",",[470,518,519],{"class":487}," UUID",[470,521,522],{"class":483},">",[470,524,525],{"class":483}," {\n",[470,527,528],{"class":472,"line":399},[470,529,531],{"class":530},"su5hD","  \n",[470,533,535],{"class":472,"line":534},5,[470,536,537],{"class":483},"}\n",[410,539,540,541,543,544,454],{},"This repository can now manage instances of ",[418,542,513],{},", where each entity will be identified by a ",[418,545,453],{},[410,547,548],{},"Now let's create that entity class.",[461,550,553],{"className":463,"code":551,"filename":552,"language":466,"meta":99,"style":99},"public class MyCustomEntity extends VitalEntity\u003CUUID> {\n  private UUID uuid;\n  \n  public UUID getUuid() {\n    return uuid;\n  }\n  \n  public void setUuid(UUID uuid) {\n    this.uuid = uuid;\n  }\n}\n","MyCustomEntity.java",[418,554,555,577,591,595,611,621,627,632,656,676,681],{"__ignoreMap":99},[470,556,557,559,561,564,566,569,571,573,575],{"class":472,"line":473},[470,558,494],{"class":487},[470,560,497],{"class":487},[470,562,563],{"class":500}," MyCustomEntity",[470,565,504],{"class":487},[470,567,568],{"class":500}," VitalEntity",[470,570,510],{"class":483},[470,572,453],{"class":487},[470,574,522],{"class":483},[470,576,525],{"class":483},[470,578,579,582,585,588],{"class":472,"line":480},[470,580,581],{"class":487},"  private",[470,583,519],{"class":584},"s_bVq",[470,586,587],{"class":530}," uuid",[470,589,590],{"class":483},";\n",[470,592,593],{"class":472,"line":491},[470,594,531],{"class":530},[470,596,597,600,602,606,609],{"class":472,"line":399},[470,598,599],{"class":487},"  public",[470,601,519],{"class":584},[470,603,605],{"class":604},"sGLFI"," getUuid",[470,607,608],{"class":483},"()",[470,610,525],{"class":483},[470,612,613,617,619],{"class":472,"line":534},[470,614,616],{"class":615},"sVHd0","    return",[470,618,587],{"class":530},[470,620,590],{"class":483},[470,622,624],{"class":472,"line":623},6,[470,625,626],{"class":483},"  }\n",[470,628,630],{"class":472,"line":629},7,[470,631,531],{"class":530},[470,633,635,637,640,643,646,648,651,654],{"class":472,"line":634},8,[470,636,599],{"class":487},[470,638,639],{"class":487}," void",[470,641,642],{"class":604}," setUuid",[470,644,645],{"class":483},"(",[470,647,453],{"class":584},[470,649,587],{"class":650},"s99_P",[470,652,653],{"class":483},")",[470,655,525],{"class":483},[470,657,659,663,665,668,672,674],{"class":472,"line":658},9,[470,660,662],{"class":661},"s39Yj","    this",[470,664,454],{"class":483},[470,666,667],{"class":530},"uuid ",[470,669,671],{"class":670},"smGrS","=",[470,673,587],{"class":530},[470,675,590],{"class":483},[470,677,679],{"class":472,"line":678},10,[470,680,626],{"class":483},[470,682,684],{"class":472,"line":683},11,[470,685,537],{"class":483},[410,687,688],{},"You can now freely add your own data to this entity class.",[461,690,692],{"className":463,"code":691,"filename":552,"language":466,"meta":99,"style":99},"public class MyCustomEntity extends VitalEntity\u003CUUID> {\n  private UUID uuid;\n  \n  private String myCustomString;\n  private boolean myCustomBoolean;\n  \u002F\u002F ...\n  \n  public UUID getUuid() {\n    return uuid;\n  }\n  \n  public void setUuid(UUID uuid) {\n    this.uuid = uuid;\n  }\n  \n  \u002F\u002F Other getters and setters...\n}\n",[418,693,694,714,724,728,740,752,757,761,773,781,785,789,808,823,828,833,839],{"__ignoreMap":99},[470,695,696,698,700,702,704,706,708,710,712],{"class":472,"line":473},[470,697,494],{"class":487},[470,699,497],{"class":487},[470,701,563],{"class":500},[470,703,504],{"class":487},[470,705,568],{"class":500},[470,707,510],{"class":483},[470,709,453],{"class":487},[470,711,522],{"class":483},[470,713,525],{"class":483},[470,715,716,718,720,722],{"class":472,"line":480},[470,717,581],{"class":487},[470,719,519],{"class":584},[470,721,587],{"class":530},[470,723,590],{"class":483},[470,725,726],{"class":472,"line":491},[470,727,531],{"class":530},[470,729,730,732,735,738],{"class":472,"line":399},[470,731,581],{"class":487},[470,733,734],{"class":584}," String",[470,736,737],{"class":530}," myCustomString",[470,739,590],{"class":483},[470,741,742,744,747,750],{"class":472,"line":534},[470,743,581],{"class":487},[470,745,746],{"class":487}," boolean",[470,748,749],{"class":530}," myCustomBoolean",[470,751,590],{"class":483},[470,753,754],{"class":472,"line":623},[470,755,756],{"class":476},"  \u002F\u002F ...\n",[470,758,759],{"class":472,"line":629},[470,760,531],{"class":530},[470,762,763,765,767,769,771],{"class":472,"line":634},[470,764,599],{"class":487},[470,766,519],{"class":584},[470,768,605],{"class":604},[470,770,608],{"class":483},[470,772,525],{"class":483},[470,774,775,777,779],{"class":472,"line":658},[470,776,616],{"class":615},[470,778,587],{"class":530},[470,780,590],{"class":483},[470,782,783],{"class":472,"line":678},[470,784,626],{"class":483},[470,786,787],{"class":472,"line":683},[470,788,531],{"class":530},[470,790,792,794,796,798,800,802,804,806],{"class":472,"line":791},12,[470,793,599],{"class":487},[470,795,639],{"class":487},[470,797,642],{"class":604},[470,799,645],{"class":483},[470,801,453],{"class":584},[470,803,587],{"class":650},[470,805,653],{"class":483},[470,807,525],{"class":483},[470,809,811,813,815,817,819,821],{"class":472,"line":810},13,[470,812,662],{"class":661},[470,814,454],{"class":483},[470,816,667],{"class":530},[470,818,671],{"class":670},[470,820,587],{"class":530},[470,822,590],{"class":483},[470,824,826],{"class":472,"line":825},14,[470,827,626],{"class":483},[470,829,831],{"class":472,"line":830},15,[470,832,531],{"class":530},[470,834,836],{"class":472,"line":835},16,[470,837,838],{"class":476},"  \u002F\u002F Other getters and setters...\n",[470,840,842],{"class":472,"line":841},17,[470,843,537],{"class":483},[845,846,848],"h2",{"id":847},"using-repositories","Using repositories",[410,850,851,852,854,855,858,859,861,862,864],{},"Now that we have a repository that can manage our very own custom entity, we can now start using it to store and retrieve entities.",[414,853],{},"\nSince we annotated our repository with ",[418,856,857],{},"@Component",", we can freely inject it into any other Spring-managed bean (All other classes annotated with ",[418,860,857],{}," or other annotations that are also annotated with ",[418,863,857],{},").",[410,866,867,868,870,871,874,875,877],{},"Let's say we are building a command and now need to store something in this repository, we can simply declare our repository as a constructor parameter for our command.",[414,869],{},"\nAnd since the ",[418,872,873],{},"@VitalCommand.Info"," annotation is indirectly also annotated with ",[418,876,857],{},", our command is also a Spring bean.",[461,879,882],{"className":463,"code":880,"filename":881,"language":466,"meta":99,"style":99},"@VitalCommand.Info\npublic class MyCommand extends VitalCommand.Spigot {\n  private final MyRepository myRepository;\n  \n  public MyCommand(MyRepository myRepository) {\n    this.myRepository = myRepository;\n  }\n}\n","MyCommand.java",[418,883,884,896,918,932,936,953,968,972],{"__ignoreMap":99},[470,885,886,888,891,893],{"class":472,"line":473},[470,887,484],{"class":483},[470,889,890],{"class":487},"VitalCommand",[470,892,454],{"class":483},[470,894,895],{"class":530},"Info\n",[470,897,898,900,902,905,907,910,913,916],{"class":472,"line":480},[470,899,494],{"class":487},[470,901,497],{"class":487},[470,903,904],{"class":500}," MyCommand",[470,906,504],{"class":487},[470,908,909],{"class":500}," VitalCommand",[470,911,454],{"class":912},"stp6e",[470,914,915],{"class":500},"Spigot",[470,917,525],{"class":483},[470,919,920,922,925,927,930],{"class":472,"line":491},[470,921,581],{"class":487},[470,923,924],{"class":487}," final",[470,926,501],{"class":584},[470,928,929],{"class":530}," myRepository",[470,931,590],{"class":483},[470,933,934],{"class":472,"line":399},[470,935,531],{"class":530},[470,937,938,940,942,944,947,949,951],{"class":472,"line":534},[470,939,599],{"class":487},[470,941,904],{"class":604},[470,943,645],{"class":483},[470,945,946],{"class":584},"MyRepository",[470,948,929],{"class":650},[470,950,653],{"class":483},[470,952,525],{"class":483},[470,954,955,957,959,962,964,966],{"class":472,"line":623},[470,956,662],{"class":661},[470,958,454],{"class":483},[470,960,961],{"class":530},"myRepository ",[470,963,671],{"class":670},[470,965,929],{"class":530},[470,967,590],{"class":483},[470,969,970],{"class":472,"line":629},[470,971,626],{"class":483},[470,973,974],{"class":472,"line":634},[470,975,537],{"class":483},[410,977,978,979,982],{},"Now if we want to store something, we can simply use the ",[418,980,981],{},"save(T)"," method.",[461,984,986],{"className":463,"code":985,"language":466,"meta":99,"style":99},"myRepository.save(new MyCustomEntity());\n",[418,987,988],{"__ignoreMap":99},[470,989,990,993,995,998,1000,1003,1005],{"class":472,"line":473},[470,991,992],{"class":530},"myRepository",[470,994,454],{"class":483},[470,996,997],{"class":604},"save",[470,999,645],{"class":483},[470,1001,1002],{"class":615},"new",[470,1004,563],{"class":604},[470,1006,1007],{"class":483},"());\n",[410,1009,1010,1011,982],{},"If we want to retrieve an entity, we can use the ",[418,1012,1013],{},"findById(Class, ID)",[461,1015,1017],{"className":463,"code":1016,"language":466,"meta":99,"style":99},"myRepository.findById(MyCustomEntity.class, theIdOfMyCustomEntity);\n",[418,1018,1019],{"__ignoreMap":99},[470,1020,1021,1023,1025,1028,1030,1032,1034,1037,1039,1042],{"class":472,"line":473},[470,1022,992],{"class":530},[470,1024,454],{"class":483},[470,1026,1027],{"class":604},"findById",[470,1029,645],{"class":483},[470,1031,513],{"class":530},[470,1033,454],{"class":483},[470,1035,1036],{"class":530},"class",[470,1038,516],{"class":483},[470,1040,1041],{"class":530}," theIdOfMyCustomEntity",[470,1043,1044],{"class":483},");\n",[410,1046,1047,1048,982],{},"If we want to delete something, we can use the ",[418,1049,1050],{},"delete(T)",[461,1052,1054],{"className":463,"code":1053,"language":466,"meta":99,"style":99},"myRepository.delete(myCustomEntity);\n",[418,1055,1056],{"__ignoreMap":99},[470,1057,1058,1060,1062,1065,1067,1070],{"class":472,"line":473},[470,1059,992],{"class":530},[470,1061,454],{"class":483},[470,1063,1064],{"class":604},"delete",[470,1066,645],{"class":483},[470,1068,1069],{"class":530},"myCustomEntity",[470,1071,1044],{"class":483},[845,1073,61],{"id":1074},"lifecycles",[1076,1077,1078,1092],"table",{},[1079,1080,1081],"thead",{},[1082,1083,1084,1089],"tr",{},[1085,1086,1088],"th",{"align":1087},"left","Method",[1085,1090,1091],{"align":1087},"Usage",[1093,1094,1095,1106],"tbody",{},[1082,1096,1097,1103],{},[1098,1099,1100],"td",{"align":1087},[418,1101,1102],{},"onSave(T)",[1098,1104,1105],{"align":1087},"Perform an action when an entity is saved to this repository.",[1082,1107,1108,1113],{},[1098,1109,1110],{"align":1087},[418,1111,1112],{},"onDelete(T)",[1098,1114,1115],{"align":1087},"Perform an action when an entity is deleted from this repository.",[1117,1118,1119],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_bVq, html code.shiki .s_bVq{--shiki-light:#9C3EDA;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":99,"searchDepth":480,"depth":480,"links":1121},[1122,1123],{"id":847,"depth":480,"text":848},{"id":1074,"depth":480,"text":61},"This page explains the general philosophy of storing temporary data in your plugin via repositories.","md",{},{"title":96},"---\ntitle: Repositories\ndescription: This page explains the general philosophy of storing temporary data in your plugin via repositories.\nnavigation:\n  title: Repositories\n---\n\n# Repositories\n\nSometimes you need to globally store some data that should be wiped when the server stops \u002F restarts.  \nVital provides a class called `VitalRepository`, which can be used for exactly that.  \n\nThe repository implementation is inspired by the Spring Boot repository solutions and uses similar syntaxes.  \n\nEssentially, a repository is nothing more than a class (instance) that stores a `Map\u003CID, Entity>` of all of your custom data entities.  \nA custom data entity may be a class that contains specific data for each entry, like `MyCustomPlayer` or `MyCustomHologram`, etc.  \n\nEach entity **must always be uniquely identifiable by some sort of ID**; a common approach to keep ids unique is to use a `UUID`.  \n\nTo make your own repository, create a class that extends from `VitalRepository`.  \n```java [MyRepository.java]\n\u002F\u002F This annotation SHOULD be used so you can inject this repository into any other Spring bean (other @Component annotated methods, classes, etc.)\n@Component\npublic class MyRepository extends VitalRepository\u003CMyCustomEntity, UUID> {\n  \n}\n```\n\nThis repository can now manage instances of `MyCustomEntity`, where each entity will be identified by a `UUID`.  \n\nNow let's create that entity class.  \n```java [MyCustomEntity.java]\npublic class MyCustomEntity extends VitalEntity\u003CUUID> {\n  private UUID uuid;\n  \n  public UUID getUuid() {\n    return uuid;\n  }\n  \n  public void setUuid(UUID uuid) {\n    this.uuid = uuid;\n  }\n}\n```\n\nYou can now freely add your own data to this entity class.  \n```java [MyCustomEntity.java]\npublic class MyCustomEntity extends VitalEntity\u003CUUID> {\n  private UUID uuid;\n  \n  private String myCustomString;\n  private boolean myCustomBoolean;\n  \u002F\u002F ...\n  \n  public UUID getUuid() {\n    return uuid;\n  }\n  \n  public void setUuid(UUID uuid) {\n    this.uuid = uuid;\n  }\n  \n  \u002F\u002F Other getters and setters...\n}\n```\n\n## Using repositories\n\nNow that we have a repository that can manage our very own custom entity, we can now start using it to store and retrieve entities.  \nSince we annotated our repository with `@Component`, we can freely inject it into any other Spring-managed bean (All other classes annotated with `@Component` or other annotations that are also annotated with `@Component`).  \n\nLet's say we are building a command and now need to store something in this repository, we can simply declare our repository as a constructor parameter for our command.  \nAnd since the `@VitalCommand.Info` annotation is indirectly also annotated with `@Component`, our command is also a Spring bean.  \n```java [MyCommand.java]\n@VitalCommand.Info\npublic class MyCommand extends VitalCommand.Spigot {\n  private final MyRepository myRepository;\n  \n  public MyCommand(MyRepository myRepository) {\n    this.myRepository = myRepository;\n  }\n}\n```\n\nNow if we want to store something, we can simply use the `save(T)` method.  \n\n```java\nmyRepository.save(new MyCustomEntity());\n```\n\nIf we want to retrieve an entity, we can use the `findById(Class, ID)` method.  \n```java\nmyRepository.findById(MyCustomEntity.class, theIdOfMyCustomEntity);\n```\n\nIf we want to delete something, we can use the `delete(T)` method.  \n```java\nmyRepository.delete(myCustomEntity);\n```\n\n## Lifecycles\n\n| Method        | Usage                                                             |\n|:--------------|:------------------------------------------------------------------|\n| `onSave(T)`   | Perform an action when an entity is saved to this repository.     |\n| `onDelete(T)` | Perform an action when an entity is deleted from this repository. |\n",{"title":96,"description":1124},"2qFIDRjXXwYdPp2NPtIGwk9m8KrSgabu-HagDFpWMPE",1789308658758]