<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://wiki.developer.olsztyn.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrator</id>
	<title>An IT Expert PKBase - Wkład użytkownika [pl]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.developer.olsztyn.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrator"/>
	<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Specjalna:Wk%C5%82ad/Administrator"/>
	<updated>2026-08-21T09:21:26Z</updated>
	<subtitle>Wkład użytkownika</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Kategoria:Hibernate&amp;diff=40</id>
		<title>Kategoria:Hibernate</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Kategoria:Hibernate&amp;diff=40"/>
		<updated>2026-05-21T20:55:25Z</updated>

		<summary type="html">&lt;p&gt;Administrator: Utworzono nową stronę &amp;quot;Hibernate articles&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hibernate articles&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=39</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=39"/>
		<updated>2026-05-21T20:54:12Z</updated>

		<summary type="html">&lt;p&gt;Administrator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** https://przybylowicz.it|Home&lt;br /&gt;
** mainpage|PKBase&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=38</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=38"/>
		<updated>2026-05-21T20:53:32Z</updated>

		<summary type="html">&lt;p&gt;Administrator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** https://przybylowicz.it|Home&lt;br /&gt;
** mainpage|PK Base&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=37</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=37"/>
		<updated>2026-05-21T20:52:42Z</updated>

		<summary type="html">&lt;p&gt;Administrator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** https://przybylowicz.it|Home&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=36</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=36"/>
		<updated>2026-05-21T20:51:24Z</updated>

		<summary type="html">&lt;p&gt;Administrator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** https://przybylowicz.it|Home&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=35</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=MediaWiki:Sidebar&amp;diff=35"/>
		<updated>2026-05-21T20:50:38Z</updated>

		<summary type="html">&lt;p&gt;Administrator: Utworzono nową stronę &amp;quot; * navigation ** mainpage|mainpage-description ** https://przybylowicz.it|Home ** randompage-url|randompage ** helppage|help-mediawiki ** specialpages-url|specialpages * SEARCH * TOOLBOX * LANGUAGES&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** https://przybylowicz.it|Home&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Strona_g%C5%82%C3%B3wna&amp;diff=34</id>
		<title>Strona główna</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Strona_g%C5%82%C3%B3wna&amp;diff=34"/>
		<updated>2026-05-21T20:30:53Z</updated>

		<summary type="html">&lt;p&gt;Administrator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;span lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;My personal knowledge base&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is a collection of my knowledge resources and lessons learned from various IT tasks.&lt;br /&gt;
&lt;br /&gt;
[[Specjalna:Kategorie|Pages are grouped by Categories]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;blockdiag&amp;quot;&amp;gt;blockdiag {&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; Outerapi -&amp;gt; &amp;quot;REST/THYMELEAF&amp;quot;;&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; PKBase -&amp;gt; &amp;quot;Wiki Articles&amp;quot;;&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; Blog -&amp;gt; &amp;quot;Wordpress Posts&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Main page&amp;quot; [color = &amp;quot;greenyellow&amp;quot;];&lt;br /&gt;
  &amp;quot;Outerapi&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;PKBase&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;Blog&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;Wiki Articles&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
  &amp;quot;Wordpress Posts&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
  &amp;quot;REST/THYMELEAF&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
}&amp;lt;/kroki&amp;gt;[[Test Flows|Check other diagrams]]&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Special:MyLanguage/Manual:Configuration_settings|Configuration settings list]]&lt;br /&gt;
* [[mediawikiwiki:Special:MyLanguage/Manual:FAQ|MediaWiki FAQ]]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [[mediawikiwiki:Special:MyLanguage/Localisation#Translation_resources|Localise MediaWiki for your language]]&lt;br /&gt;
* [[mediawikiwiki:Special:MyLanguage/Manual:Combating_spam|Learn how to combat spam on your wiki]]&lt;br /&gt;
&lt;br /&gt;
Consult the [[mediawikiwiki:Special:MyLanguage/Help:Contents|User&#039;s Guide]] for information on using the wiki software.&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Gastro_Integrator&amp;diff=33</id>
		<title>Gastro Integrator</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Gastro_Integrator&amp;diff=33"/>
		<updated>2026-05-19T14:10:22Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;kroki lang=&amp;quot;blockdiag&amp;quot;&amp;gt;blockdiag {&lt;br /&gt;
  &amp;quot;restaumatic.com&amp;quot; -&amp;gt; &amp;quot;Gastro Integrator&amp;quot; -&amp;gt; &amp;quot;cromcabistro.pl&amp;quot;;&lt;br /&gt;
  &amp;quot;restaumatic.com&amp;quot; [color = &amp;quot;greenyellow&amp;quot;];&lt;br /&gt;
  &amp;quot;Gastro Integrator&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;cromcabistro.pl&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
}&amp;lt;/kroki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Main_Page&amp;diff=31</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Main_Page&amp;diff=31"/>
		<updated>2026-05-19T14:10:22Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;&amp;lt;span lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;My personal knowledge base&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is a collection of my knowledge resources and lessons learned from various IT tasks.&lt;br /&gt;
&lt;br /&gt;
[[Special:Categories|Pages are grouped by Categories]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;blockdiag&amp;quot;&amp;gt;blockdiag {&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; Outerapi -&amp;gt; &amp;quot;REST/THYMELEAF&amp;quot;;&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; PKBase -&amp;gt; &amp;quot;Wiki Articles&amp;quot;;&lt;br /&gt;
  &amp;quot;Main page&amp;quot; -&amp;gt; Blog -&amp;gt; &amp;quot;Wordpress Posts&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Main page&amp;quot; [color = &amp;quot;greenyellow&amp;quot;];&lt;br /&gt;
  &amp;quot;Outerapi&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;PKBase&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;Blog&amp;quot; [color = &amp;quot;pink&amp;quot;];&lt;br /&gt;
  &amp;quot;Wiki Articles&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
  &amp;quot;Wordpress Posts&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
  &amp;quot;REST/THYMELEAF&amp;quot; [color = &amp;quot;orange&amp;quot;];&lt;br /&gt;
}&amp;lt;/kroki&amp;gt;[[Test Flows|Check other diagrams]]&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
Consult the [[mediawikiwiki:Special:MyLanguage/Help:Contents|User&#039;s Guide]] for information on using the wiki software.&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Feel_free_to_visit_my_blog&amp;diff=29</id>
		<title>Feel free to visit my blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Feel_free_to_visit_my_blog&amp;diff=29"/>
		<updated>2026-05-19T14:10:22Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I invite you to visit my [http://192.168.179.10/blog blog].&lt;br /&gt;
&lt;br /&gt;
All parts of whole service are integrated autenthicated.&lt;br /&gt;
&lt;br /&gt;
Please use OpenId Connect connection if available.&lt;br /&gt;
[[Category:Hosting]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Nginx&amp;diff=27</id>
		<title>Nginx</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Nginx&amp;diff=27"/>
		<updated>2026-05-19T14:10:22Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nginx [engine x] to serwer proxy, reverse proxy, mail proxy server. Może też pełnić rolę ogólnego serwera proxy TCP/UDP (jeszcze nie wiem co to znaczy).&lt;br /&gt;
Dla mnie wartością jest to, że na jednym porcie https/443 mogę wystawiać rożne aplikacje http (pracujące na rożnych portach), może także wystawiać swój kontent bez proxowania:&lt;br /&gt;
* /cool-site https://serwer.com&lt;br /&gt;
* http/8080 https://serwer.com/app1&lt;br /&gt;
* http/7070 https://serwer.com/app2&lt;br /&gt;
* Do tego wspólnego portu, https/443, można dodać certyfikat SSL, co daje możliwość uruchomia wielu aplikacji i usług typu REST na jednym certyfikacie i jednym hoście (domenie).&lt;br /&gt;
Przykładem jest ta wiki, wystawiona na Nginxie, który działa na porcie https/443 i jednocześnie proxuje na niego aplikację Java Spring Boot z portu http/8080, zapewniając obu aplikacjom bezpieczne połączenie.&lt;br /&gt;
[[Category:Hosting]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Cloud_infrastructure_costs&amp;diff=25</id>
		<title>Cloud infrastructure costs</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Cloud_infrastructure_costs&amp;diff=25"/>
		<updated>2026-05-19T14:10:21Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AZURE: An App Service with Elastic Azure Database Server for MySQL costs about 250 PLN (50 EUR) / month, for hosting an app that basically did nothing, perhaps a cache could reduce costs.&lt;br /&gt;
&lt;br /&gt;
ASAP switched to nazwa.pl, 25 PLN per month for smallest VPC hosting program, but this case also need some linux experience.&lt;br /&gt;
&lt;br /&gt;
Stay nazwa.pl client with 20 % discount by my [https://www.nazwa.pl/pp/am86-7446-9653 partnership link], followers can be empowerment with my free, limited support. Details are preparing.&lt;br /&gt;
[[Category:Hosting]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Hosting_resources_on_the_Internet&amp;diff=23</id>
		<title>Hosting resources on the Internet</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Hosting_resources_on_the_Internet&amp;diff=23"/>
		<updated>2026-05-19T14:10:20Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hosting]]&lt;br /&gt;
Czasami zachodzi potrzeba przeniesienia się z tym co udostępniamy w internecie do innego dostawcy usług hostingowych. Warto na ten, często awaryjny, krok być przygotowanym aby móc go przeprowadzić szybko i sprawnie. Najlepiej sobie wszystko wcześniej zaplanować, najpierw zinwentaryzuję co już zbudowałem:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!metoda pozyskania&lt;br /&gt;
!pochodzenie &lt;br /&gt;
|-&lt;br /&gt;
|Zmiana adresu w DNS&lt;br /&gt;
|ręcznie&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://home.pl&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Aplikacja Java Spring Boot, wystawia się http:7070&lt;br /&gt;
|build from git&lt;br /&gt;
|https://gitlab.com/java-padawans/microservices.git&lt;br /&gt;
|-&lt;br /&gt;
|Open JDK-21&lt;br /&gt;
|install on OS&lt;br /&gt;
|sudo apt-get install openjdk-21-jre-headless&lt;br /&gt;
|-&lt;br /&gt;
|MySQL server v8&lt;br /&gt;
|install on OS&lt;br /&gt;
|sudo apt install mysql-server&lt;br /&gt;
|-&lt;br /&gt;
|Nginx - proxy 443&amp;gt;7070, www&lt;br /&gt;
|install on OS&lt;br /&gt;
|sudo apt install nginx-light&lt;br /&gt;
sudo apt-get install nginx-extras&lt;br /&gt;
|-&lt;br /&gt;
|Cool Nginx error pages&lt;br /&gt;
Konfiguracja Nginx&lt;br /&gt;
w szczególności Wikimedia config&lt;br /&gt;
|backup&lt;br /&gt;
|/srv/http/default&lt;br /&gt;
/etc/nginx, /etc/nginx/sites-available/default&lt;br /&gt;
/etc/nginx/snippets/mediawiki.conf&lt;br /&gt;
|-&lt;br /&gt;
|Folder www wikimedii&lt;br /&gt;
|backup&lt;br /&gt;
|/var/www/html/wikimedia&lt;br /&gt;
|-&lt;br /&gt;
|Certyfikaty SSL&lt;br /&gt;
|backup&lt;br /&gt;
|/home/outerapis/ssl/&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;zadbać o bezpieczeństwo klucza prywatnego&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Skrypty MySQL Database recovery&lt;br /&gt;
|backup&lt;br /&gt;
|/home/outerapis/sqls&lt;br /&gt;
microservices/outerapis/src/main/resources/create.sql&lt;br /&gt;
microservices/outerapis/src/main/resources/data.sql&lt;br /&gt;
|-&lt;br /&gt;
|sshd config&lt;br /&gt;
|backup&lt;br /&gt;
|/etc/ssh/sshd_config&lt;br /&gt;
|-&lt;br /&gt;
|sudo config&lt;br /&gt;
|backup&lt;br /&gt;
|/etc/sudoers&lt;br /&gt;
|-&lt;br /&gt;
|Skrypt dla usługi systemd&lt;br /&gt;
|backup&lt;br /&gt;
|/etc/systemd/system/outerapis.service&lt;br /&gt;
/etc/default/outerapis&lt;br /&gt;
|-&lt;br /&gt;
|Domyślne ustawienia dla polecenia less&lt;br /&gt;
|backup&lt;br /&gt;
|/etc/default/less&lt;br /&gt;
|-&lt;br /&gt;
|Skrypt dla usługi logrotate&lt;br /&gt;
|backup&lt;br /&gt;
|/etc/logrotate.d/outerapis&lt;br /&gt;
|-&lt;br /&gt;
|Skrypt MySQL Database backup&lt;br /&gt;
|backup&lt;br /&gt;
|export, zip&lt;br /&gt;
|-&lt;br /&gt;
|Odtworzenie konfiguracji: skrypty / ręcznie.&lt;br /&gt;
Co jest robione ręcznie musi być udokumentowane na wiki, wraz z uzasadnieniem dlaczego nie można danego kroku zautomatyzować.&lt;br /&gt;
|backup, wiki&lt;br /&gt;
|user for adm, user for app&lt;br /&gt;
ssh keys&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;Ten dokument powinien być wydrukowany i przechowywany w odpowiednim skoroszycie w kategorii RECOVERY, lub w postaci elektronicznej, poza file systemem dostępnym w ramach hostingu. &#039;&#039;&#039;Przy braku dostępności usługi hostingowej, zasoby tej wikipedii nie będą dostępne.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Log rorate ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
$ cat /etc/logrotate.d/outerapis&lt;br /&gt;
/var/log/outerapis/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    rotate 7&lt;br /&gt;
    maxsize 10M&lt;br /&gt;
    missingok&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx proxy ==&lt;br /&gt;
Podstawowa konfiguracja&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
location / {&lt;br /&gt;
    proxy_pass http://localhost:7070;&lt;br /&gt;
    proxy_http_version  1.1;&lt;br /&gt;
    #proxy_redirect off;&lt;br /&gt;
    proxy_read_timeout 60s;&lt;br /&gt;
    include /etc/nginx/proxy_params;&lt;br /&gt;
    proxy_redirect http:// https://;&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Nginx|Więcej o konfigurowaniu Nginx]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Hibernate&amp;diff=21</id>
		<title>Hibernate</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Hibernate&amp;diff=21"/>
		<updated>2026-05-19T14:09:57Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Main Page]]&lt;br /&gt;
&#039;&#039;Pod żadnym pozorem nie uzurpuję sobie praw do poniższych treści. To cenna wiedza do której czesto sięgam i o którą czasem jestem pytany, wiec sobie troche to ułatwiłem opracowując w moim rodzimym języku treści dostępne w oryginale na stronie oficjalnej dokumentacji [https://docs.hibernate.org/orm/7.3/userguide Hibernate.org 7.3], starałem sie zapewnić dobrą jakość przekładu.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 3.8 Asocjacje ====&lt;br /&gt;
Chcesz zapanować nad relacjami? Używaj Hibernate :)&lt;br /&gt;
&lt;br /&gt;
====== @ManyToOne ======&lt;br /&gt;
Najczęstsze skojarzenie, posiadające bezpośredni odpowiednik w relacyjnej bazie danych, a więc adnotacja ta ustanawia relację między podmiotem potomnym a rodzicem. Każdy podmiot ma swój własny cykl życia. Po ustawieniu skojarzenia &#039;&#039;&#039;@ManyToOne&#039;&#039;&#039;, Hibernate dodaje kolumnę powiązanego klucza obcego.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person = new Person();&lt;br /&gt;
entityManager.persist( person );&lt;br /&gt;
&lt;br /&gt;
Phone phone = new Phone( &amp;quot;123-456-7890&amp;quot; );&lt;br /&gt;
phone.setPerson( person );&lt;br /&gt;
entityManager.persist( phone );&lt;br /&gt;
&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
phone.setPerson( null );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO Person ( id )&lt;br /&gt;
VALUES ( 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Phone ( number, person_id, id )&lt;br /&gt;
VALUES ( &#039;123-456-7890&#039;, 1, 2 )&lt;br /&gt;
&lt;br /&gt;
UPDATE Phone&lt;br /&gt;
SET    number = &#039;123-456-7890&#039;,&lt;br /&gt;
       person_id = NULL&lt;br /&gt;
WHERE  id = 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== @OneToMany =====&lt;br /&gt;
Łączy podmiot nadrzędny z jednym lub większą liczbą podmiotów potomnych. Jeśli &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; nie ma odwrotnego skojarzenia @ManyToOne po stronie dziecka, to skojarzenie &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; jest jednokierunkowe. Jeśli istnieje @ManyToOne po stronie dziecka, skojarzenie &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; jest dwukierunkowe, a twórca aplikacji może poruszać się po tej relacji z obu stron.&lt;br /&gt;
&lt;br /&gt;
====== Jednokierunkowy @OneToMany ======&lt;br /&gt;
W jednokierunkowym skojarzeniu &#039;&#039;&#039;@OneToMany&#039;&#039;&#039;, Hibernate  tworzy połączenia między dwoma obiektami.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)&lt;br /&gt;
	private List&amp;lt;Phone&amp;gt; phones = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;Phone&amp;quot;)&lt;br /&gt;
public static class Phone {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Person (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person_Phone (&lt;br /&gt;
    Person_id BIGINT NOT NULL ,&lt;br /&gt;
    phones_id BIGINT NOT NULL&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Phone (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Phone&lt;br /&gt;
ADD CONSTRAINT UK_9uhc5itwc9h5gcng944pcaslf&lt;br /&gt;
UNIQUE (phones_id)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Phone&lt;br /&gt;
ADD CONSTRAINT FKr38us2n8g5p9rj0b494sd3391&lt;br /&gt;
FOREIGN KEY (phones_id) REFERENCES Phone&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Phone&lt;br /&gt;
ADD CONSTRAINT FK2ex4e4p7w1cj310kg2woisjl2&lt;br /&gt;
FOREIGN KEY (Person_id) REFERENCES Person&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Asocjacja &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; jest z definicji asocjacją nadrzędną, niezależnie od tego, czy jest jedno, czy dwukierunkowa. Tylko strona nadrzędna asocjacji ma sens, aby kaskadować przejścia stanu encji do jej elementów podrzędnych.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person = new Person();&lt;br /&gt;
Phone phone1 = new Phone( &amp;quot;123-456-7890&amp;quot; );&lt;br /&gt;
Phone phone2 = new Phone( &amp;quot;321-654-0987&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
person.getPhones().add( phone1 );&lt;br /&gt;
person.getPhones().add( phone2 );&lt;br /&gt;
entityManager.persist( person );&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
&lt;br /&gt;
person.getPhones().remove( phone1 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO Person&lt;br /&gt;
       ( id )&lt;br /&gt;
VALUES ( 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Phone&lt;br /&gt;
       ( number, id )&lt;br /&gt;
VALUES ( &#039;123-456-7890&#039;, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Phone&lt;br /&gt;
       ( number, id )&lt;br /&gt;
VALUES ( &#039;321-654-0987&#039;, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Phone&lt;br /&gt;
       ( Person_id, phones_id )&lt;br /&gt;
VALUES ( 1, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Phone&lt;br /&gt;
       ( Person_id, phones_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
&lt;br /&gt;
DELETE FROM Person_Phone&lt;br /&gt;
WHERE  Person_id = 1&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Phone&lt;br /&gt;
       ( Person_id, phones_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
&lt;br /&gt;
DELETE FROM Phone&lt;br /&gt;
WHERE  id = 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podczas utrwalania encji Person, kaskada rozpropaguje operację utrwalania również do bazowych elementów potomnych Phone. Po usunięciu elementu Phone z kolekcji phones, wiersz skojarzenia jest usuwany z tabeli linków, a &amp;lt;u&amp;gt;atrybut &#039;&#039;&#039;orphanRemoval&#039;&#039;&#039; również spowoduje usunięcie elementu Phone&amp;lt;/u&amp;gt;.&lt;br /&gt;
Jednokierunkowe powiązania nie są zbyt wydajne w przypadku usuwania encji podrzędnych. W powyższym przykładzie, po opróżnieniu kontekstu utrwalania, Hibernate usuwa wszystkie wiersze bazy danych z tabeli linków (np. Person_Phone), które są powiązane z nadrzędną encją Person, i ponownie wstawia te, które nadal znajdują się w kolekcji &#039;&#039;&#039;@OneToMany&#039;&#039;&#039;. Z drugiej strony, dwukierunkowe powiązanie &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; jest znacznie wydajniejsze, ponieważ encja podrzędna kontroluje powiązanie.&lt;br /&gt;
&lt;br /&gt;
====== Dwukierunkowe powiązanie @OneToMany ======&lt;br /&gt;
Dwukierunkowe powiązanie &#039;&#039;&#039;@OneToMany&#039;&#039;&#039; wymaga również powiązania @ManyToOne po stronie potomnej. Chociaż model domeny udostępnia dwie strony do nawigacji po tym powiązaniu, w tle relacyjna baza danych ma tylko jeden klucz obcy dla tej relacji.&lt;br /&gt;
&lt;br /&gt;
Każde powiązanie dwukierunkowe musi mieć tylko jedną stronę właścicielską (stronę potomną), a druga jest określana jako strona odwrotna (lub strona &#039;&#039;&#039;mappedBy&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@OneToMany(mappedBy = &amp;quot;person&amp;quot;, cascade = CascadeType.ALL, orphanRemoval = true)&lt;br /&gt;
	private List&amp;lt;Phone&amp;gt; phones = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	public void addPhone(Phone phone) {&lt;br /&gt;
		phones.add( phone );&lt;br /&gt;
		phone.setPerson( this );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void removePhone(Phone phone) {&lt;br /&gt;
		phones.remove( phone );&lt;br /&gt;
		phone.setPerson( null );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;Phone&amp;quot;)&lt;br /&gt;
public static class Phone {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@NaturalId&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;, unique = true)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	@ManyToOne&lt;br /&gt;
	private Person person;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if ( this == o ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if ( o == null || getClass() != o.getClass() ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		Phone phone = (Phone) o;&lt;br /&gt;
		return Objects.equals( number, phone.number );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash( number );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Person (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Phone (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    person_id BIGINT ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Phone&lt;br /&gt;
ADD CONSTRAINT UK_l329ab0g4c1t78onljnxmbnp6&lt;br /&gt;
UNIQUE (number)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Phone&lt;br /&gt;
ADD CONSTRAINT FKmw13yfsjypiiq0i1osdkaeqpg&lt;br /&gt;
FOREIGN KEY (person_id) REFERENCES Person&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Za każdym razem, gdy tworzone jest skojarzenie dwukierunkowe, programista aplikacji musi upewnić się, że obie strony są zawsze zsynchronizowane. Metody &#039;&#039;&#039;addPhone()&#039;&#039;&#039; i &#039;&#039;&#039;removePhone()&#039;&#039;&#039; to metody narzędziowe, które synchronizują obie strony za każdym razem, gdy dodawany lub usuwany jest element podrzędny.&lt;br /&gt;
Ponieważ klasa Phone ma kolumnę &#039;&#039;&#039;@NaturalId&#039;&#039;&#039; (numer telefonu jest unikalny), &#039;&#039;&#039;equals()&#039;&#039;&#039; i &#039;&#039;&#039;hashCode()&#039;&#039;&#039; mogą korzystać z tej właściwości, a logika &#039;&#039;&#039;removePhone()&#039;&#039;&#039; zostaje zredukowana do metody &#039;&#039;&#039;remove()&#039;&#039;&#039; z Java Collection.&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do jednokierunkowego &#039;&#039;&#039;@OneToMany&#039;&#039;&#039;, dwukierunkowe skojarzenie jest znacznie bardziej wydajne w zarządzaniu stanem trwałości kolekcji. Każde usunięcie elementu wymaga tylko jednej aktualizacji (w której kolumna klucza obcego jest ustawiana na NULL), a jeśli cykl życia encji potomnej jest powiązany z jej elementem nadrzędnym, tak że encja potomna nie może istnieć bez niego, wówczas możemy opatrzyć skojarzenie adnotacją atrybutu orphanRemoval, a usunięcie encji potomnej spowoduje również instrukcję delete dla wiersza tabeli potomnej.&lt;br /&gt;
&lt;br /&gt;
===== @OneToOne =====&lt;br /&gt;
Asocjacja &#039;&#039;&#039;@OneToOne&#039;&#039;&#039; może być jednokierunkowa lub dwukierunkowa. Asocjacja jednokierunkowa jest zgodna z semantyką klucza obcego relacyjnej bazy danych, a właścicielem relacji jest strona klienta. Asocjacja dwukierunkowa zawiera również stronę nadrzędną &#039;&#039;&#039;mappedBy&#039;&#039;&#039; &#039;&#039;&#039;@OneToOne&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====== Jednokierunkowy @OneToOne ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Phone&amp;quot;)&lt;br /&gt;
public static class Phone {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	@OneToOne&lt;br /&gt;
	@JoinColumn(name = &amp;quot;details_id&amp;quot;)&lt;br /&gt;
	private PhoneDetails details;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;PhoneDetails&amp;quot;)&lt;br /&gt;
public static class PhoneDetails {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String provider;&lt;br /&gt;
&lt;br /&gt;
	private String technology;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Phone (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    details_id BIGINT ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE PhoneDetails (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    provider VARCHAR(255) ,&lt;br /&gt;
    technology VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Phone&lt;br /&gt;
ADD CONSTRAINT FKnoj7cj83ppfqbnvqqa5kolub7&lt;br /&gt;
FOREIGN KEY (details_id) REFERENCES PhoneDetails&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Z punktu widzenia relacyjnej bazy danych, schemat bazowy jest identyczny z jednokierunkowym skojarzeniem &#039;&#039;&#039;@ManyToOne&#039;&#039;&#039;, ponieważ strona klienta kontroluje relację w oparciu o kolumnę klucza obcego. Nietypowe jest jednak traktowanie telefonu jako strony klienta, a szczegółów telefonu jako strony nadrzędnej, ponieważ szczegóły nie mogą istnieć bez faktycznego telefonu. Znacznie bardziej naturalnym odwzorowaniem byłoby umieszczenie telefonu jako strony nadrzędnej, a zatem umieszczenie klucza obcego w tabeli szczegółów telefonu.&lt;br /&gt;
&lt;br /&gt;
====== Dwukierunkowy @OneToOne ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Phone&amp;quot;)&lt;br /&gt;
public static class Phone {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	@OneToOne(&lt;br /&gt;
			mappedBy = &amp;quot;phone&amp;quot;,&lt;br /&gt;
			cascade = CascadeType.ALL,&lt;br /&gt;
			orphanRemoval = true,&lt;br /&gt;
			fetch = FetchType.LAZY&lt;br /&gt;
	)&lt;br /&gt;
	private PhoneDetails details;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	public void addDetails(PhoneDetails details) {&lt;br /&gt;
		details.setPhone( this );&lt;br /&gt;
		this.details = details;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void removeDetails() {&lt;br /&gt;
		if ( details != null ) {&lt;br /&gt;
			details.setPhone( null );&lt;br /&gt;
			this.details = null;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;PhoneDetails&amp;quot;)&lt;br /&gt;
public static class PhoneDetails {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String provider;&lt;br /&gt;
&lt;br /&gt;
	private String technology;&lt;br /&gt;
&lt;br /&gt;
	@OneToOne(fetch = FetchType.LAZY)&lt;br /&gt;
	@JoinColumn(name = &amp;quot;phone_id&amp;quot;)&lt;br /&gt;
	private Phone phone;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Phone (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE PhoneDetails (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    provider VARCHAR(255) ,&lt;br /&gt;
    technology VARCHAR(255) ,&lt;br /&gt;
    phone_id BIGINT ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE PhoneDetails&lt;br /&gt;
ADD CONSTRAINT FKeotuev8ja8v0sdh29dynqj05p&lt;br /&gt;
FOREIGN KEY (phone_id) REFERENCES Phone&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Tym razem właścicielem skojarzenia jest PhoneDetails i, jak w przypadku każdego dwukierunkowego skojarzenia, strona nadrzędna może propagować swój cykl życia do strony podrzędnej poprzez kaskadowanie.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Phone phone = new Phone( &amp;quot;123-456-7890&amp;quot; );&lt;br /&gt;
PhoneDetails details = new PhoneDetails( &amp;quot;T-Mobile&amp;quot;, &amp;quot;GSM&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
phone.addDetails( details );&lt;br /&gt;
entityManager.persist( phone );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO Phone ( number, id )&lt;br /&gt;
VALUES ( &#039;123-456-7890&#039;, 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO PhoneDetails ( phone_id, provider, technology, id )&lt;br /&gt;
VALUES ( 1, &#039;T-Mobile&#039;, &#039;GSM&#039;, 2 )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Podczas korzystania z dwukierunkowego skojarzenia &#039;&#039;&#039;@OneToOne&#039;&#039;&#039;, Hibernate wymusza ograniczenie unikalności podczas pobierania strony potomnej. Jeśli z tym samym obiektem nadrzędnym powiązanych jest więcej niż jeden obiekt potomny, Hibernate zgłosi wyjątek &amp;lt;u&amp;gt;org.hibernate.exception.ConstraintViolationException&amp;lt;/u&amp;gt;. Np, podczas dodawania kolejnego obiektu PhoneDetails, Hibernate weryfikuje ograniczenie unikalności podczas ponownego ładowania obiektu Phone.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
PhoneDetails otherDetails = new PhoneDetails( &amp;quot;T-Mobile&amp;quot;, &amp;quot;CDMA&amp;quot; );&lt;br /&gt;
otherDetails.setPhone( phone );&lt;br /&gt;
entityManager.persist( otherDetails );&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
entityManager.clear();&lt;br /&gt;
&lt;br /&gt;
//throws jakarta.persistence.PersistenceException: org.hibernate.HibernateException: More than one row with the given identifier was found: 1&lt;br /&gt;
phone = entityManager.find( Phone.class, phone.getId() );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Dwukierunkowe, leniwe skojarzenie @OneToOne ======&lt;br /&gt;
Chociaż można dodać adnotację do skojarzenia po stronie nadrzędnej, aby było ono pobierane leniwie, Hibernate nie może zrealizować tego żądania, ponieważ nie wie, czy skojarzenie jest puste, czy nie.&lt;br /&gt;
&lt;br /&gt;
Jedynym sposobem na sprawdzenie, czy po stronie podrzędnej istnieje skojarzenie, jest pobranie skojarzenia potomnego za pomocą zapytania pomocniczego. Ponieważ może to prowadzić do problemów z zapytaniami N+1, znacznie bardziej efektywne jest użycie jednokierunkowych skojarzeń &#039;&#039;&#039;@OneToOne&#039;&#039;&#039; z adnotacją &#039;&#039;&#039;@MapsId&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Jeśli jednak naprawdę potrzebujesz użyć skojarzenia dwukierunkowego i chcesz mieć pewność, że zawsze będzie ono pobierane leniwie, musisz włączyć rozszerzenie bajtkodu inicjalizacji stanu leniwego.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Phone&amp;quot;)&lt;br /&gt;
public static class Phone {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	@OneToOne(&lt;br /&gt;
			mappedBy = &amp;quot;phone&amp;quot;,&lt;br /&gt;
			cascade = CascadeType.ALL,&lt;br /&gt;
			orphanRemoval = true,&lt;br /&gt;
			fetch = FetchType.LAZY&lt;br /&gt;
	)&lt;br /&gt;
	private PhoneDetails details;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	public void addDetails(PhoneDetails details) {&lt;br /&gt;
		details.setPhone( this );&lt;br /&gt;
		this.details = details;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void removeDetails() {&lt;br /&gt;
		if ( details != null ) {&lt;br /&gt;
			details.setPhone( null );&lt;br /&gt;
			this.details = null;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;PhoneDetails&amp;quot;)&lt;br /&gt;
public static class PhoneDetails {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String provider;&lt;br /&gt;
&lt;br /&gt;
	private String technology;&lt;br /&gt;
&lt;br /&gt;
	@OneToOne(fetch = FetchType.LAZY)&lt;br /&gt;
	@JoinColumn(name = &amp;quot;phone_id&amp;quot;)&lt;br /&gt;
	private Phone phone;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== @ManyToMany =====&lt;br /&gt;
Asocjacja &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; wymaga tabeli linków, która łączy dwie encje. Podobnie jak asocjacja &#039;&#039;&#039;@OneToMany&#039;&#039;&#039;, &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; może być jednokierunkowa lub dwukierunkowa.&lt;br /&gt;
&lt;br /&gt;
====== Jednokierunkowy @ManyToMany ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})&lt;br /&gt;
	private List&amp;lt;Address&amp;gt; addresses = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;Address&amp;quot;)&lt;br /&gt;
public static class Address {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String street;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Address (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    street VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person_Address (&lt;br /&gt;
    Person_id BIGINT NOT NULL ,&lt;br /&gt;
    addresses_id BIGINT NOT NULL&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Address&lt;br /&gt;
ADD CONSTRAINT FKm7j0bnabh2yr0pe99il1d066u&lt;br /&gt;
FOREIGN KEY (addresses_id) REFERENCES Address&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Address&lt;br /&gt;
ADD CONSTRAINT FKba7rc9qe2vh44u93u0p2auwti&lt;br /&gt;
FOREIGN KEY (Person_id) REFERENCES Person&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Podobnie jak w przypadku jednokierunkowych skojarzeń @OneToMany, tabela linków jest kontrolowana przez stronę posiadającą.&lt;br /&gt;
&lt;br /&gt;
Gdy encja jest usuwana z kolekcji &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039;, Hibernate po prostu usuwa rekord łączenia z tabeli linków. Niestety, operacja ta wymaga usunięcia wszystkich wpisów powiązanych z danym elementem nadrzędnym i ponownego utworzenia tych, które są wymienione w bieżącym kontekście utwalania.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person1 = new Person();&lt;br /&gt;
Person person2 = new Person();&lt;br /&gt;
&lt;br /&gt;
Address address1 = new Address( &amp;quot;12th Avenue&amp;quot;, &amp;quot;12A&amp;quot; );&lt;br /&gt;
Address address2 = new Address( &amp;quot;18th Avenue&amp;quot;, &amp;quot;18B&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
person1.getAddresses().add( address1 );&lt;br /&gt;
person1.getAddresses().add( address2 );&lt;br /&gt;
&lt;br /&gt;
person2.getAddresses().add( address1 );&lt;br /&gt;
&lt;br /&gt;
entityManager.persist( person1 );&lt;br /&gt;
entityManager.persist( person2 );&lt;br /&gt;
&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
&lt;br /&gt;
person1.getAddresses().remove( address1 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO Person ( id )&lt;br /&gt;
VALUES ( 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Address ( number, street, id )&lt;br /&gt;
VALUES ( &#039;12A&#039;, &#039;12th Avenue&#039;, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Address ( number, street, id )&lt;br /&gt;
VALUES ( &#039;18B&#039;, &#039;18th Avenue&#039;, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person ( id )&lt;br /&gt;
VALUES ( 4 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( Person_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 2 )&lt;br /&gt;
INSERT INTO Person_Address ( Person_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
INSERT INTO Person_Address ( Person_id, addresses_id )&lt;br /&gt;
VALUES ( 4, 2 )&lt;br /&gt;
&lt;br /&gt;
DELETE FROM Person_Address&lt;br /&gt;
WHERE  Person_id = 1&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( Person_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 W przypadku asocjacji &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; kaskadowanie przejścia stanu encji &#039;&#039;&#039;REMOVE&#039;&#039;&#039; nie ma sensu, ponieważ będzie ono propagowane poza tabelę linków. Ponieważ do drugiej strony mogą odwoływać się inne encje po stronie nadrzędnej, automatyczne usunięcie może zakończyć się wyjątkiem &#039;&#039;&#039;ConstraintViolationException&#039;&#039;&#039;.&lt;br /&gt;
 Na przykład, gdyby zdefiniowano &#039;&#039;&#039;@ManyToMany(cascade = CascadeType.ALL)&#039;&#039;&#039; i pierwsza osoba zostałaby usunięta, Hibernate zgłosiłby wyjątek, ponieważ inna osoba nadal jest powiązana z usuwanym adresem.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person1 = entityManager.find(Person.class, personId);&lt;br /&gt;
entityManager.remove(person1);&lt;br /&gt;
&lt;br /&gt;
Caused by: jakarta.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement&lt;br /&gt;
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement&lt;br /&gt;
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no action; FKM7J0BNABH2YR0PE99IL1D066U table: PERSON_ADDRESS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/blockquote&amp;gt;Poprzez proste usunięcie strony nadrzędnej Hibernate może bezpiecznie usunąć powiązane rekordy łączy, jak widać w poniższym przykładzie:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person1 = entityManager.find( Person.class, personId );&lt;br /&gt;
entityManager.remove( person1 );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
DELETE FROM Person_Address&lt;br /&gt;
WHERE  Person_id = 1&lt;br /&gt;
&lt;br /&gt;
DELETE FROM Person&lt;br /&gt;
WHERE  id = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Dwukierunkowy @ManyToMany ======&lt;br /&gt;
Dwukierunkowe skojarzenie &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; ma stronę „właściciel” i „mappedBy”. Aby zachować synchronizację między obiema stronami, warto zapewnić metody pomocnicze do dodawania lub usuwania encji podrzędnych.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@NaturalId&lt;br /&gt;
	private String registrationNumber;&lt;br /&gt;
&lt;br /&gt;
	@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})&lt;br /&gt;
	private List&amp;lt;Address&amp;gt; addresses = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	public void addAddress(Address address) {&lt;br /&gt;
		addresses.add(address);&lt;br /&gt;
		address.getOwners().add(this);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void removeAddress(Address address) {&lt;br /&gt;
		addresses.remove(address);&lt;br /&gt;
		address.getOwners().remove(this);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if (this == o) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if (o == null || getClass() != o.getClass()) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		Person person = (Person) o;&lt;br /&gt;
		return Objects.equals(registrationNumber, person.registrationNumber);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash(registrationNumber);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;Address&amp;quot;)&lt;br /&gt;
public static class Address {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String street;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	private String postalCode;&lt;br /&gt;
&lt;br /&gt;
	@ManyToMany(mappedBy = &amp;quot;addresses&amp;quot;)&lt;br /&gt;
	private List&amp;lt;Person&amp;gt; owners = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if (this == o) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if (o == null || getClass() != o.getClass()) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		Address address = (Address) o;&lt;br /&gt;
		return Objects.equals(street, address.street) &amp;amp;&amp;amp;&lt;br /&gt;
				Objects.equals(number, address.number) &amp;amp;&amp;amp;&lt;br /&gt;
				Objects.equals(postalCode, address.postalCode);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash(street, number, postalCode);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Address (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    postalCode VARCHAR(255) ,&lt;br /&gt;
    street VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    registrationNumber VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person_Address (&lt;br /&gt;
    owners_id BIGINT NOT NULL ,&lt;br /&gt;
    addresses_id BIGINT NOT NULL&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person&lt;br /&gt;
ADD CONSTRAINT UK_23enodonj49jm8uwec4i7y37f&lt;br /&gt;
UNIQUE (registrationNumber)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Address&lt;br /&gt;
ADD CONSTRAINT FKm7j0bnabh2yr0pe99il1d066u&lt;br /&gt;
FOREIGN KEY (addresses_id) REFERENCES Address&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person_Address&lt;br /&gt;
ADD CONSTRAINT FKbn86l24gmxdv2vmekayqcsgup&lt;br /&gt;
FOREIGN KEY (owners_id) REFERENCES Person&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dzięki zastosowaniu metod pomocniczych zarządzanie synchronizacją może zostać uproszczone, co widać w poniższym przykładzie:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person1 = new Person(&amp;quot;ABC-123&amp;quot;);&lt;br /&gt;
Person person2 = new Person(&amp;quot;DEF-456&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Address address1 = new Address(&amp;quot;12th Avenue&amp;quot;, &amp;quot;12A&amp;quot;, &amp;quot;4005A&amp;quot;);&lt;br /&gt;
Address address2 = new Address(&amp;quot;18th Avenue&amp;quot;, &amp;quot;18B&amp;quot;, &amp;quot;4007B&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
person1.addAddress(address1);&lt;br /&gt;
person1.addAddress(address2);&lt;br /&gt;
&lt;br /&gt;
person2.addAddress(address1);&lt;br /&gt;
&lt;br /&gt;
entityManager.persist(person1);&lt;br /&gt;
entityManager.persist(person2);&lt;br /&gt;
&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
&lt;br /&gt;
person1.removeAddress(address1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO Person ( registrationNumber, id )&lt;br /&gt;
VALUES ( &#039;ABC-123&#039;, 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Address ( number, postalCode, street, id )&lt;br /&gt;
VALUES ( &#039;12A&#039;, &#039;4005A&#039;, &#039;12th Avenue&#039;, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Address ( number, postalCode, street, id )&lt;br /&gt;
VALUES ( &#039;18B&#039;, &#039;4007B&#039;, &#039;18th Avenue&#039;, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person ( registrationNumber, id )&lt;br /&gt;
VALUES ( &#039;DEF-456&#039;, 4 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( owners_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( owners_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( owners_id, addresses_id )&lt;br /&gt;
VALUES ( 4, 2 )&lt;br /&gt;
&lt;br /&gt;
DELETE FROM Person_Address&lt;br /&gt;
WHERE  owners_id = 1&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Person_Address ( owners_id, addresses_id )&lt;br /&gt;
VALUES ( 1, 3 )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jeśli dwukierunkowe skojarzenie @OneToMany działa lepiej podczas usuwania lub zmiany kolejności elementów potomnych, relacja &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; nie może skorzystać z takiej optymalizacji, ponieważ klucz obcy nie ma nad nią kontroli. Aby obejść to ograniczenie, tabela linków musi być bezpośrednio ujawniona, a skojarzenie &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039; musi zostać podzielone na dwie dwukierunkowe relacje @OneToMany.&lt;br /&gt;
&lt;br /&gt;
===== Dwukierunkowa komunikacja wiele-do-wielu z jednostką łącza =====&lt;br /&gt;
Najbardziej naturalne skojarzenie @ManyToMany opiera się na tej samej logice, co schemat bazy danych, a tabela łączy ma skojarzoną encję, która kontroluje relację dla obu stron, które mają zostać połączone.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person implements Serializable {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	@NaturalId&lt;br /&gt;
	private String registrationNumber;&lt;br /&gt;
&lt;br /&gt;
	@OneToMany(&lt;br /&gt;
			mappedBy = &amp;quot;person&amp;quot;,&lt;br /&gt;
			cascade = CascadeType.ALL,&lt;br /&gt;
			orphanRemoval = true&lt;br /&gt;
	)&lt;br /&gt;
	private List&amp;lt;PersonAddress&amp;gt; addresses = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	public void addAddress(Address address) {&lt;br /&gt;
		PersonAddress personAddress = new PersonAddress( this, address );&lt;br /&gt;
		addresses.add( personAddress );&lt;br /&gt;
		address.getOwners().add( personAddress );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void removeAddress(Address address) {&lt;br /&gt;
		PersonAddress personAddress = new PersonAddress( this, address );&lt;br /&gt;
		address.getOwners().remove( personAddress );&lt;br /&gt;
		addresses.remove( personAddress );&lt;br /&gt;
		personAddress.setPerson( null );&lt;br /&gt;
		personAddress.setAddress( null );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if ( this == o ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if ( o == null || getClass() != o.getClass() ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		Person person = (Person) o;&lt;br /&gt;
		return Objects.equals( registrationNumber, person.registrationNumber );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash( registrationNumber );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;PersonAddress&amp;quot;)&lt;br /&gt;
public static class PersonAddress implements Serializable {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@ManyToOne&lt;br /&gt;
	private Person person;&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@ManyToOne&lt;br /&gt;
	private Address address;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if ( this == o ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if ( o == null || getClass() != o.getClass() ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		PersonAddress that = (PersonAddress) o;&lt;br /&gt;
		return Objects.equals( person, that.person ) &amp;amp;&amp;amp;&lt;br /&gt;
			Objects.equals( address, that.address );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash( person, address );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;Address&amp;quot;)&lt;br /&gt;
public static class Address implements Serializable {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	@GeneratedValue&lt;br /&gt;
	private Long id;&lt;br /&gt;
&lt;br /&gt;
	private String street;&lt;br /&gt;
&lt;br /&gt;
	@Column(name = &amp;quot;`number`&amp;quot;)&lt;br /&gt;
	private String number;&lt;br /&gt;
&lt;br /&gt;
	private String postalCode;&lt;br /&gt;
&lt;br /&gt;
	@OneToMany(&lt;br /&gt;
			mappedBy = &amp;quot;address&amp;quot;,&lt;br /&gt;
			cascade = CascadeType.ALL,&lt;br /&gt;
			orphanRemoval = true&lt;br /&gt;
	)&lt;br /&gt;
	private List&amp;lt;PersonAddress&amp;gt; owners = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean equals(Object o) {&lt;br /&gt;
		if ( this == o ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if ( o == null || getClass() != o.getClass() ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		Address address = (Address) o;&lt;br /&gt;
		return Objects.equals( street, address.street ) &amp;amp;&amp;amp;&lt;br /&gt;
			Objects.equals( number, address.number ) &amp;amp;&amp;amp;&lt;br /&gt;
			Objects.equals( postalCode, address.postalCode );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public int hashCode() {&lt;br /&gt;
		return Objects.hash( street, number, postalCode );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE Address (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    number VARCHAR(255) ,&lt;br /&gt;
    postalCode VARCHAR(255) ,&lt;br /&gt;
    street VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Person (&lt;br /&gt;
    id BIGINT NOT NULL ,&lt;br /&gt;
    registrationNumber VARCHAR(255) ,&lt;br /&gt;
    PRIMARY KEY ( id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE PersonAddress (&lt;br /&gt;
    person_id BIGINT NOT NULL ,&lt;br /&gt;
    address_id BIGINT NOT NULL ,&lt;br /&gt;
    PRIMARY KEY ( person_id, address_id )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE Person&lt;br /&gt;
ADD CONSTRAINT UK_23enodonj49jm8uwec4i7y37f&lt;br /&gt;
UNIQUE (registrationNumber)&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE PersonAddress&lt;br /&gt;
ADD CONSTRAINT FK8b3lru5fyej1aarjflamwghqq&lt;br /&gt;
FOREIGN KEY (person_id) REFERENCES Person&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE PersonAddress&lt;br /&gt;
ADD CONSTRAINT FK7p69mgialumhegyl4byrh65jk&lt;br /&gt;
FOREIGN KEY (address_id) REFERENCES Address&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Zarówno Person, jak i Address mają stronę mappedBy @OneToMany, podczas gdy PersonAddress jest właścicielem osoby i adresu @ManyToOne. Ponieważ to mapowanie składa się z dwóch dwukierunkowych skojarzeń, metody pomocnicze są jeszcze bardziej istotne.&lt;br /&gt;
 W powyższym przykładzie wykorzystano mapowanie specyficzne dla Hibernate dla encji łącza, ponieważ Jakarta Persistence nie pozwala na utworzenie identyfikatora złożonego z wielu powiązań @ManyToOne.&lt;br /&gt;
 Aby uzyskać więcej informacji, zapoznaj się z sekcją dotyczącą identyfikatorów złożonych z powiązaniami.&lt;br /&gt;
Przejścia stanów encji są lepiej zarządzane niż w poprzednim przypadku dwukierunkowego &#039;&#039;&#039;@ManyToMany&#039;&#039;&#039;.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person1 = new Person( &amp;quot;ABC-123&amp;quot; );&lt;br /&gt;
Person person2 = new Person( &amp;quot;DEF-456&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Address address1 = new Address( &amp;quot;12th Avenue&amp;quot;, &amp;quot;12A&amp;quot;, &amp;quot;4005A&amp;quot; );&lt;br /&gt;
Address address2 = new Address( &amp;quot;18th Avenue&amp;quot;, &amp;quot;18B&amp;quot;, &amp;quot;4007B&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
entityManager.persist( person1 );&lt;br /&gt;
entityManager.persist( person2 );&lt;br /&gt;
&lt;br /&gt;
entityManager.persist( address1 );&lt;br /&gt;
entityManager.persist( address2 );&lt;br /&gt;
&lt;br /&gt;
person1.addAddress( address1 );&lt;br /&gt;
person1.addAddress( address2 );&lt;br /&gt;
&lt;br /&gt;
person2.addAddress( address1 );&lt;br /&gt;
&lt;br /&gt;
entityManager.flush();&lt;br /&gt;
&lt;br /&gt;
person1.removeAddress( address1 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT  INTO Person ( registrationNumber, id )&lt;br /&gt;
VALUES  ( &#039;ABC-123&#039;, 1 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO Person ( registrationNumber, id )&lt;br /&gt;
VALUES  ( &#039;DEF-456&#039;, 2 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO Address ( number, postalCode, street, id )&lt;br /&gt;
VALUES  ( &#039;12A&#039;, &#039;4005A&#039;, &#039;12th Avenue&#039;, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO Address ( number, postalCode, street, id )&lt;br /&gt;
VALUES  ( &#039;18B&#039;, &#039;4007B&#039;, &#039;18th Avenue&#039;, 4 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO PersonAddress ( person_id, address_id )&lt;br /&gt;
VALUES  ( 1, 3 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO PersonAddress ( person_id, address_id )&lt;br /&gt;
VALUES  ( 1, 4 )&lt;br /&gt;
&lt;br /&gt;
INSERT  INTO PersonAddress ( person_id, address_id )&lt;br /&gt;
VALUES  ( 2, 3 )&lt;br /&gt;
&lt;br /&gt;
DELETE  FROM PersonAddress&lt;br /&gt;
WHERE   person_id = 1 AND address_id = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wykonana zostaje tylko jedna instrukcja usunięcia, ponieważ tym razem powiązanie jest kontrolowane przez stronę &#039;&#039;&#039;@ManyToOne&#039;&#039;&#039;, która musi jedynie monitorować stan podstawowej relacji klucza obcego, aby wywołać odpowiednią instrukcję DML.&lt;br /&gt;
&lt;br /&gt;
===== @NotFound =====&lt;br /&gt;
W przypadku skojarzeń, które nie są wymuszane przez fizyczny klucz obcy, istnieje możliwość, że wartość klucza obcego inna niż null będzie wskazywać na nieistniejącą wartość w tabeli skojarzonej jednostki.&lt;br /&gt;
 Zdecydowanie odradza się egzekwowanie stosowania fizycznych kluczy obcych na poziomie bazy danych.&lt;br /&gt;
Hibernate zapewnia obsługę takich modeli, korzystając z adnotacji @NotFound, która akceptuje wartość NotFoundAction wskazującą sposób zachowania się Hibernate w przypadku napotkania takich uszkodzonych kluczy obcych.&lt;br /&gt;
&lt;br /&gt;
; EXCEPTION&lt;br /&gt;
: (default) Hibernate zuci wyjątek (&amp;lt;code&amp;gt;FetchNotFoundException&amp;lt;/code&amp;gt;)&lt;br /&gt;
; IGNORE&lt;br /&gt;
: powiązanie będzie traktowane jako &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zarówno @NotFound(IGNORE), jak i @NotFound(EXCEPTION) powodują, że Hibernate zakłada brak fizycznego klucza obcego.&lt;br /&gt;
&lt;br /&gt;
Powiązania @ManyToOne i @OneToOne z adnotacją @NotFound są zawsze pobierane chciwie, nawet jeśli strategia pobierania jest ustawiona na FetchType.LAZY.&lt;br /&gt;
 Jeśli aplikacja sama zarządza integralnością referencyjną i może zagwarantować brak uszkodzonych kluczy obcych, można zamiast tego użyć metody jakarta.persistence.ForeignKey(NO_CONSTRAINT). Zmusi to Hibernate do nieeksportowania fizycznych kluczy obcych, ale nadal będzie zachowywać się tak, jakby istniał, unikając wad @NotFound.&lt;br /&gt;
Biorąc pod uwagę następujące mapowania jednostek Miasto i Osoba:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
@Table(name = &amp;quot;Person&amp;quot;)&lt;br /&gt;
public static class Person {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	private Integer id;&lt;br /&gt;
	private String name;&lt;br /&gt;
&lt;br /&gt;
	@ManyToOne&lt;br /&gt;
	@NotFound(action = NotFoundAction.IGNORE)&lt;br /&gt;
	@JoinColumn(name = &amp;quot;city_fk&amp;quot;, referencedColumnName = &amp;quot;id&amp;quot;)&lt;br /&gt;
	private City city;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Entity(name = &amp;quot;City&amp;quot;)&lt;br /&gt;
@Table(name = &amp;quot;City&amp;quot;)&lt;br /&gt;
public static class City implements Serializable {&lt;br /&gt;
&lt;br /&gt;
	@Id&lt;br /&gt;
	private Integer id;&lt;br /&gt;
&lt;br /&gt;
	private String name;&lt;br /&gt;
&lt;br /&gt;
	//Getters and setters are omitted for brevity&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jeżeli w naszej bazie danych znajdują się następujące podmioty:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
City newYork = new City( 1, &amp;quot;New York&amp;quot; );&lt;br /&gt;
entityManager.persist( newYork );&lt;br /&gt;
&lt;br /&gt;
Person person = new Person( 1, &amp;quot;John Doe&amp;quot;, newYork );&lt;br /&gt;
entityManager.persist( person );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Podczas ładowania jednostki Person, Hibernate jest w stanie zlokalizować powiązaną jednostkę nadrzędną City:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person = entityManager.find( Person.class, 1 );&lt;br /&gt;
assertEquals( &amp;quot;New York&amp;quot;, person.getCity().getName() );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jeśli jednak złamiemy klucz obcy:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// the database allows this because there is no physical foreign-key&lt;br /&gt;
entityManager.createQuery( &amp;quot;delete City&amp;quot; ).executeUpdate();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hibernate nie zgłosi żadnego wyjątku i przypisze wartość null do nieistniejącego odniesienia do encji City:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Person person = entityManager.find( Person.class, 1 );&lt;br /&gt;
&lt;br /&gt;
assertNull( person.getCity(), &amp;quot;person.getCity() should be null&amp;quot; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;&#039;&#039;@NotFound&#039;&#039;&#039;&#039;&#039; wpływa również na sposób traktowania skojarzenia jako „dołączeń niejawnych” w HQL i kryteriach. W przypadku fizycznego klucza obcego, Hibernate może bezpiecznie założyć, że wartość w kolumnie (kolumnach) klucza obcego będzie zgodna z wartością w kolumnie (kolumnach) docelowej (docelowych), ponieważ baza danych upewnia się, że tak jest. Jednak &#039;&#039;&#039;&#039;&#039;@NotFound&#039;&#039;&#039;&#039;&#039; wymusza na Hibernate wykonanie dołączenia fizycznego dla dołączeń niejawnych, gdy w innym przypadku mogłoby to nie być konieczne.&lt;br /&gt;
&lt;br /&gt;
Korzystając z modelu Person/City, rozważmy zapytanie z Person p, gdzie p.city.id ma wartość null.&lt;br /&gt;
&lt;br /&gt;
Normalnie Hibernate nie potrzebowałby łączenia między tabelą Person a tabelą City, ponieważ fizyczny klucz obcy zapewniałby, że każda wartość różna od null w kolumnie Person.cityName miałaby odpowiadającą jej wartość różną od null w kolumnie City.name.&lt;br /&gt;
&lt;br /&gt;
Jednak w przypadku mapowań &#039;&#039;&#039;&#039;&#039;@NotFound&#039;&#039;&#039;&#039;&#039; możliwe jest zerwanie skojarzenia, ponieważ nie ma fizycznego klucza obcego wymuszającego relację. Jak widać w sekcji „Zerwanie klucza obcego”, kolumna Person.cityName dla Johna Doe została zmieniona z „Nowy Jork” na „Atlantis”, mimo że w bazie danych nie ma miasta o nazwie „Atlantis”. Hibernate nie może zaufać wartości klucza obcego („Atlantis”), która ma odpowiadającą wartość docelową, więc musi łączyć się z tabelą City, aby rozwiązać wartość city.id.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
final List&amp;lt;Person&amp;gt; nullResults = entityManager&lt;br /&gt;
		.createQuery( &amp;quot;from Person p where p.city.id is null&amp;quot;, Person.class )&lt;br /&gt;
		.getResultList();&lt;br /&gt;
assertThat( nullResults ).isEmpty();&lt;br /&gt;
&lt;br /&gt;
final List&amp;lt;Person&amp;gt; nonNullResults = entityManager&lt;br /&gt;
		.createQuery( &amp;quot;from Person p where p.city.id is not null&amp;quot;, Person.class )&lt;br /&gt;
		.getResultList();&lt;br /&gt;
assertThat( nonNullResults ).isEmpty();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Żaden z wyników nie zawiera dopasowania dla „John Doe”, ponieważ sprzężenie wewnętrzne filtruje ten wiersz.&lt;br /&gt;
&lt;br /&gt;
Hibernate obsługuje metodę odwołania się bezpośrednio do kolumny klucza (Person.cityName) w zapytaniu za pomocą specjalnej funkcji fk(..). Np.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
final List&amp;lt;String&amp;gt; nullResults = entityManager&lt;br /&gt;
		.createQuery( &amp;quot;select p.name from Person p where fk( p.city ) is null&amp;quot;, String.class )&lt;br /&gt;
		.getResultList();&lt;br /&gt;
&lt;br /&gt;
assertThat( nullResults ).isEmpty();&lt;br /&gt;
&lt;br /&gt;
final List&amp;lt;String&amp;gt; nonNullResults = entityManager&lt;br /&gt;
		.createQuery( &amp;quot;select p.name from Person p left join p.city c where fk( c ) is not null&amp;quot;, String.class )&lt;br /&gt;
		.getResultList();&lt;br /&gt;
assertThat( nonNullResults ).hasSize( 1 );&lt;br /&gt;
assertThat( nonNullResults.get( 0 ) ).isEqualTo( &amp;quot;John Doe&amp;quot; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hibernate]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Test_Flows&amp;diff=19</id>
		<title>Test Flows</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Test_Flows&amp;diff=19"/>
		<updated>2026-05-19T14:09:37Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
[[File:Plantuml.png|thumb|[[PlantUML Diagram sample]]]]&lt;br /&gt;
[[File:Diagramipv4.png|thumb|[[Bytefield Diagram sample]]]]&lt;br /&gt;
[[File:Ditaadiagram.png|thumb|[[Ditaa Diagram sample]]]]&lt;br /&gt;
[[File:Erddiagram.png|thumb|[[Erd Diagram sample]]]]&lt;br /&gt;
[[File:Seqdiag.png|thumb|[[SeqDiag Diagram sample]]]]&lt;br /&gt;
[[File:Packet.png|thumb|[[Packetdiag sample]]]]&lt;br /&gt;
&#039;&#039;&#039;Mermaid Sequence diagram&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;mermaid&amp;quot;&amp;gt;sequenceDiagram&lt;br /&gt;
    participant Alice&lt;br /&gt;
    participant Bob&lt;br /&gt;
    Alice-&amp;gt;John: Hello John, how are you?&lt;br /&gt;
    loop Healthcheck&lt;br /&gt;
        John-&amp;gt;John: Fight against hypochondria&lt;br /&gt;
    end&lt;br /&gt;
    Note right of John: Rational thoughts prevail...&lt;br /&gt;
    John--&amp;gt;Alice: Great!&lt;br /&gt;
    John-&amp;gt;Bob: How about you?&lt;br /&gt;
    Bob--&amp;gt;John: Jolly good!&amp;lt;/kroki&amp;gt;&#039;&#039;&#039;Mermaid Class diagrams&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;mermaid&amp;quot;&amp;gt;classDiagram&lt;br /&gt;
    note &amp;quot;From Duck till Zebra&amp;quot;&lt;br /&gt;
    Animal &amp;lt;|-- Duck&lt;br /&gt;
    note for Duck &amp;quot;can fly\ncan swim\ncan dive\ncan help in debugging&amp;quot;&lt;br /&gt;
    Animal &amp;lt;|-- Fish&lt;br /&gt;
    Animal &amp;lt;|-- Zebra&lt;br /&gt;
    Animal : +int age&lt;br /&gt;
    Animal : +String gender&lt;br /&gt;
    Animal: +isMammal()&lt;br /&gt;
    Animal: +mate()&lt;br /&gt;
    class Duck{&lt;br /&gt;
        +String beakColor&lt;br /&gt;
        +swim()&lt;br /&gt;
        +quack()&lt;br /&gt;
    }&lt;br /&gt;
    class Fish{&lt;br /&gt;
        -int sizeInFeet&lt;br /&gt;
        -canEat()&lt;br /&gt;
    }&lt;br /&gt;
    class Zebra{&lt;br /&gt;
        +bool is_wild&lt;br /&gt;
        +run()&lt;br /&gt;
    }&amp;lt;/kroki&amp;gt;&#039;&#039;&#039;Mermaid Classes and Annotations&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;mermaid&amp;quot;&amp;gt;&lt;br /&gt;
classDiagram&lt;br /&gt;
    class BankAccount&lt;br /&gt;
    BankAccount : +String owner&lt;br /&gt;
    BankAccount : +Bigdecimal balance&lt;br /&gt;
    BankAccount : +deposit(amount)&lt;br /&gt;
    BankAccount : +withdrawal(amount)&lt;br /&gt;
class Shape{&lt;br /&gt;
    &amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;br /&gt;
    noOfVertices&lt;br /&gt;
    draw()&lt;br /&gt;
}&lt;br /&gt;
class Color{&lt;br /&gt;
    &amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;br /&gt;
    RED&lt;br /&gt;
    BLUE&lt;br /&gt;
    GREEN&lt;br /&gt;
    WHITE&lt;br /&gt;
    BLACK&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&#039;&#039;&#039;Mermaid, setting the direction of the diagram&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;mermaid&amp;quot;&amp;gt;&lt;br /&gt;
classDiagram&lt;br /&gt;
  direction RL&lt;br /&gt;
  class Student {&lt;br /&gt;
    -idCard : IdCard&lt;br /&gt;
  }&lt;br /&gt;
  class IdCard{&lt;br /&gt;
    -id : int&lt;br /&gt;
    -name : string&lt;br /&gt;
  }&lt;br /&gt;
  class Bike{&lt;br /&gt;
    -id : int&lt;br /&gt;
    -name : string&lt;br /&gt;
  }&lt;br /&gt;
  Student &amp;quot;1&amp;quot; --o &amp;quot;1&amp;quot; IdCard : carries&lt;br /&gt;
  Student &amp;quot;1&amp;quot; --o &amp;quot;1&amp;quot; Bike : rides&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;BPMN diagram&amp;lt;kroki lang=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;definitions xmlns=&amp;quot;http://www.omg.org/spec/BPMN/20100524/MODEL&amp;quot;&lt;br /&gt;
             xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
             xmlns:bpmndi=&amp;quot;http://www.omg.org/spec/BPMN/20100524/DI&amp;quot;&lt;br /&gt;
             xmlns:omgdc=&amp;quot;http://www.omg.org/spec/DD/20100524/DC&amp;quot;&lt;br /&gt;
             xmlns:omgdi=&amp;quot;http://www.omg.org/spec/DD/20100524/DI&amp;quot;&lt;br /&gt;
             typeLanguage=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;
             expressionLanguage=&amp;quot;http://www.w3.org/1999/XPath&amp;quot;&lt;br /&gt;
             targetNamespace=&amp;quot;http://bpmn.io/schema/bpmn&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;process id=&amp;quot;Process_1&amp;quot; isExecutable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;startEvent id=&amp;quot;StartEvent_1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/process&amp;gt;&lt;br /&gt;
  &amp;lt;bpmndi:BPMNDiagram id=&amp;quot;BPMNDiagram_1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;bpmndi:BPMNPlane id=&amp;quot;BPMNPlane_1&amp;quot; bpmnElement=&amp;quot;Process_1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;_BPMNShape_StartEvent_2&amp;quot; bpmnElement=&amp;quot;StartEvent_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;omgdc:Bounds x=&amp;quot;152&amp;quot; y=&amp;quot;102&amp;quot; width=&amp;quot;36&amp;quot; height=&amp;quot;36&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmndi:BPMNPlane&amp;gt;&lt;br /&gt;
  &amp;lt;/bpmndi:BPMNDiagram&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&amp;lt;/kroki&amp;gt;Actdiag Diagram&amp;lt;kroki lang=&amp;quot;actdiag&amp;quot;&amp;gt;&lt;br /&gt;
actdiag {&lt;br /&gt;
  write -&amp;gt; convert -&amp;gt; image&lt;br /&gt;
&lt;br /&gt;
  lane user {&lt;br /&gt;
     label = &amp;quot;User&amp;quot;&lt;br /&gt;
     write [label = &amp;quot;Writing reST&amp;quot;];&lt;br /&gt;
     image [label = &amp;quot;Get diagram IMAGE&amp;quot;];&lt;br /&gt;
  }&lt;br /&gt;
  lane actdiag {&lt;br /&gt;
     convert [label = &amp;quot;Convert reST to Image&amp;quot;];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/kroki&amp;gt;Rackdiag Diagram&amp;lt;kroki lang=&amp;quot;rackdiag&amp;quot;&amp;gt;&lt;br /&gt;
rackdiag {&lt;br /&gt;
  // define height of rack&lt;br /&gt;
  16U;&lt;br /&gt;
&lt;br /&gt;
  // define rack items&lt;br /&gt;
  1: UPS [2U];&lt;br /&gt;
  3: DB Server&lt;br /&gt;
  4: Web Server&lt;br /&gt;
  5: Web Server&lt;br /&gt;
  6: Web Server&lt;br /&gt;
  7: Load Balancer&lt;br /&gt;
  8: L3 Switch&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=PlantUML_Diagram_sample&amp;diff=17</id>
		<title>PlantUML Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=PlantUML_Diagram_sample&amp;diff=17"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&lt;br /&gt;
More inspiration on https://plantuml.com/&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;plantuml&amp;quot;&amp;gt;&lt;br /&gt;
@startwbs&lt;br /&gt;
skinparam monochrome true&lt;br /&gt;
* Business Process Modelling WBS&lt;br /&gt;
** Launch the project&lt;br /&gt;
*** Complete Stakeholder Research&lt;br /&gt;
*** Initial Implementation Plan&lt;br /&gt;
** Design phase&lt;br /&gt;
*** Model of AsIs Processes Completed&lt;br /&gt;
**** Model of AsIs Processes Completed1&lt;br /&gt;
**** Model of AsIs Processes Completed2&lt;br /&gt;
*** Measure AsIs performance metrics&lt;br /&gt;
*** Identify Quick Wins&lt;br /&gt;
** Complete innovate phase&lt;br /&gt;
@endwbs&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&amp;lt;kroki lang=&amp;quot;plantuml&amp;quot;&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
participant Participant as Foo&lt;br /&gt;
actor       Actor       as Foo1&lt;br /&gt;
boundary    Boundary    as Foo2&lt;br /&gt;
control     Control     as Foo3&lt;br /&gt;
entity      Entity      as Foo4&lt;br /&gt;
database    Database    as Foo5&lt;br /&gt;
collections Collections as Foo6&lt;br /&gt;
queue       Queue       as Foo7&lt;br /&gt;
Foo -&amp;gt; Foo1 : To actor &lt;br /&gt;
Foo -&amp;gt; Foo2 : To boundary&lt;br /&gt;
Foo -&amp;gt; Foo3 : To control&lt;br /&gt;
Foo -&amp;gt; Foo4 : To entity&lt;br /&gt;
Foo -&amp;gt; Foo5 : To database&lt;br /&gt;
Foo -&amp;gt; Foo6 : To collections&lt;br /&gt;
Foo -&amp;gt; Foo7: To queue&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&amp;lt;kroki lang=&amp;quot;plantuml&amp;quot;&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
Alice -&amp;gt; Bob: Authentication Request&lt;br /&gt;
&lt;br /&gt;
alt successful case&lt;br /&gt;
&lt;br /&gt;
    Bob -&amp;gt; Alice: Authentication Accepted&lt;br /&gt;
&lt;br /&gt;
else some kind of failure&lt;br /&gt;
&lt;br /&gt;
    Bob -&amp;gt; Alice: Authentication Failure&lt;br /&gt;
    group My own label&lt;br /&gt;
    Alice -&amp;gt; Log : Log attack start&lt;br /&gt;
        loop 1000 times&lt;br /&gt;
            Alice -&amp;gt; Bob: DNS Attack&lt;br /&gt;
        end&lt;br /&gt;
    Alice -&amp;gt; Log : Log attack end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
else Another type of failure&lt;br /&gt;
&lt;br /&gt;
   Bob -&amp;gt; Alice: Please repeat&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&amp;lt;kroki lang=&amp;quot;plantuml&amp;quot;&amp;gt;&lt;br /&gt;
 [Edit online] 	&lt;br /&gt;
&lt;br /&gt;
@startuml&lt;br /&gt;
left to right direction&lt;br /&gt;
actor Guest as g&lt;br /&gt;
package Professional {&lt;br /&gt;
  actor Chef as c&lt;br /&gt;
  actor &amp;quot;Food Critic&amp;quot; as fc&lt;br /&gt;
}&lt;br /&gt;
package Restaurant {&lt;br /&gt;
  usecase &amp;quot;Eat Food&amp;quot; as UC1&lt;br /&gt;
  usecase &amp;quot;Pay for Food&amp;quot; as UC2&lt;br /&gt;
  usecase &amp;quot;Drink&amp;quot; as UC3&lt;br /&gt;
  usecase &amp;quot;Review&amp;quot; as UC4&lt;br /&gt;
}&lt;br /&gt;
fc --&amp;gt; UC4&lt;br /&gt;
g --&amp;gt; UC1&lt;br /&gt;
g --&amp;gt; UC2&lt;br /&gt;
g --&amp;gt; UC3&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;[[Test Flows|back]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=SeqDiag_Diagram_sample&amp;diff=15</id>
		<title>SeqDiag Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=SeqDiag_Diagram_sample&amp;diff=15"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;seqdiag&amp;quot;&amp;gt;&lt;br /&gt;
seqdiag {&lt;br /&gt;
  browser  -&amp;gt; webserver [label = &amp;quot;GET /index.html&amp;quot;];&lt;br /&gt;
  browser &amp;lt;-- webserver;&lt;br /&gt;
  browser  -&amp;gt; webserver [label = &amp;quot;POST /blog/comment&amp;quot;];&lt;br /&gt;
  webserver  -&amp;gt; database [label = &amp;quot;INSERT comment&amp;quot;];&lt;br /&gt;
  webserver &amp;lt;-- database;&lt;br /&gt;
  browser &amp;lt;-- webserver;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/kroki&amp;gt;[[Test Flows|back]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Erd_Diagram_sample&amp;diff=13</id>
		<title>Erd Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Erd_Diagram_sample&amp;diff=13"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;erd&amp;quot;&amp;gt;[Persons]&lt;br /&gt;
*name&lt;br /&gt;
email&lt;br /&gt;
mobile_num&lt;br /&gt;
pwd&lt;br /&gt;
+role_id&lt;br /&gt;
+address_id&lt;br /&gt;
+operator_id&lt;br /&gt;
&lt;br /&gt;
[Operators]&lt;br /&gt;
*operator_id&lt;br /&gt;
name&lt;br /&gt;
&lt;br /&gt;
[Roles]&lt;br /&gt;
*role_id&lt;br /&gt;
role_name&lt;br /&gt;
&lt;br /&gt;
[Addresses]&lt;br /&gt;
*address_id&lt;br /&gt;
address1&lt;br /&gt;
address2&lt;br /&gt;
city&lt;br /&gt;
country&lt;br /&gt;
state&lt;br /&gt;
zip_code&lt;br /&gt;
&lt;br /&gt;
Persons *--1 Operators&lt;br /&gt;
Persons *--1 Roles&lt;br /&gt;
Addresses 1--1 Persons&amp;lt;/kroki&amp;gt;&lt;br /&gt;
[[Test Flows|back]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Packetdiag_sample&amp;diff=11</id>
		<title>Packetdiag sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Packetdiag_sample&amp;diff=11"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;packetdiag&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  colwidth = 32&lt;br /&gt;
  node_height = 72&lt;br /&gt;
&lt;br /&gt;
  0-15: Source Port&lt;br /&gt;
  16-31: Destination Port&lt;br /&gt;
  32-63: Sequence Number&lt;br /&gt;
  64-95: Acknowledgment Number&lt;br /&gt;
  96-99: Data Offset&lt;br /&gt;
  100-105: Reserved&lt;br /&gt;
  106: URG [rotate = 270]&lt;br /&gt;
  107: ACK [rotate = 270]&lt;br /&gt;
  108: PSH [rotate = 270]&lt;br /&gt;
  109: RST [rotate = 270]&lt;br /&gt;
  110: SYN [rotate = 270]&lt;br /&gt;
  111: FIN [rotate = 270]&lt;br /&gt;
  112-127: Window&lt;br /&gt;
  128-143: Checksum&lt;br /&gt;
  144-159: Urgent Pointer&lt;br /&gt;
  160-191: (Options and Padding)&lt;br /&gt;
  192-223: data [colheight = 3]&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/kroki&amp;gt;[[Test Flows|Return]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Ditaa_Diagram_sample&amp;diff=9</id>
		<title>Ditaa Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Ditaa_Diagram_sample&amp;diff=9"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&amp;lt;kroki lang=&amp;quot;ditaa&amp;quot;&amp;gt;&lt;br /&gt;
    +--------+   +-------+    +-------+     /-----------------\&lt;br /&gt;
    |        | --+ ditaa +--&amp;gt; |       |     | Things to do    |&lt;br /&gt;
    |  Text  |   +-------+    |diagram|     | cGRE            |&lt;br /&gt;
    |Document|   |!magic!|    |       |     | o Cut the grass |&lt;br /&gt;
    |     {d}|   |       |    |       |     | o Buy jam       |&lt;br /&gt;
    +---+----+   +-------+    +-------+     | o Fix car       |&lt;br /&gt;
        :                         ^         | o Make website  |&lt;br /&gt;
        |       Lots of work      |         \-----------------/&lt;br /&gt;
        +-------------------------+&lt;br /&gt;
        &lt;br /&gt;
&amp;lt;/kroki&amp;gt;[[Test Flows|Return]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Bytefield_Diagram_sample&amp;diff=7</id>
		<title>Bytefield Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Bytefield_Diagram_sample&amp;diff=7"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diagrams]]&lt;br /&gt;
&#039;&#039;&#039;Number as bits&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;bytefield&amp;quot;&amp;gt;&lt;br /&gt;
(def left-margin 1)&lt;br /&gt;
(def boxes-per-row 8)&lt;br /&gt;
(draw-column-headers {:labels (reverse (take 8 column-labels))})&lt;br /&gt;
(draw-related-boxes (number-as-bits 0xd3 8))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;&#039;&#039;&#039;Internet Protocol Version 4 header (RFC791)&#039;&#039;&#039;&amp;lt;kroki lang=&amp;quot;bytefield&amp;quot;&amp;gt;&lt;br /&gt;
(draw-column-headers)&lt;br /&gt;
(draw-box &amp;quot;Version&amp;quot; {:span 4})&lt;br /&gt;
(draw-box &amp;quot;IHL&amp;quot; {:span 4})&lt;br /&gt;
(draw-box &amp;quot;DSCP&amp;quot; {:span 6})&lt;br /&gt;
(draw-box &amp;quot;ECN&amp;quot; {:span 2})&lt;br /&gt;
(draw-box &amp;quot;Total length&amp;quot; {:span 16})&lt;br /&gt;
(draw-box &amp;quot;Identification&amp;quot; {:span 16})&lt;br /&gt;
(draw-box &amp;quot;Flags&amp;quot; {:span 3})&lt;br /&gt;
(draw-box &amp;quot;Fragment offset&amp;quot; {:span 13})&lt;br /&gt;
(draw-box &amp;quot;Time to live&amp;quot; {:span 8})&lt;br /&gt;
(draw-box &amp;quot;Protocol&amp;quot; {:span 8})&lt;br /&gt;
(draw-box &amp;quot;Header checksum&amp;quot; {:span 16})&lt;br /&gt;
(draw-box &amp;quot;Source IP address&amp;quot; [{:span 16}, :box-above])&lt;br /&gt;
(draw-box nil [{:span 16}, :box-below])&lt;br /&gt;
&lt;br /&gt;
(draw-box &amp;quot;Destination IP address&amp;quot; [{:span 16}, :box-above])&lt;br /&gt;
(draw-box nil [{:span 16}, :box-below])&lt;br /&gt;
&lt;br /&gt;
(draw-gap &amp;quot;Options (if IHL &amp;gt; 5)&amp;quot;)&lt;br /&gt;
(draw-bottom)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/kroki&amp;gt;[[Test Flows|Return]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=BPMN_Diagram_sample&amp;diff=5</id>
		<title>BPMN Diagram sample</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=BPMN_Diagram_sample&amp;diff=5"/>
		<updated>2026-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;kroki lang=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;definitions xmlns=&amp;quot;http://www.omg.org/spec/BPMN/20100524/MODEL&amp;quot;&lt;br /&gt;
             xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
             xmlns:bpmndi=&amp;quot;http://www.omg.org/spec/BPMN/20100524/DI&amp;quot;&lt;br /&gt;
             xmlns:omgdc=&amp;quot;http://www.omg.org/spec/DD/20100524/DC&amp;quot;&lt;br /&gt;
             xmlns:omgdi=&amp;quot;http://www.omg.org/spec/DD/20100524/DI&amp;quot;&lt;br /&gt;
             typeLanguage=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;
             expressionLanguage=&amp;quot;http://www.w3.org/1999/XPath&amp;quot;&lt;br /&gt;
             targetNamespace=&amp;quot;http://bpmn.io/schema/bpmn&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;message id=&amp;quot;_1275940932310&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;message id=&amp;quot;_1275940932433&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;process id=&amp;quot;_6-1&amp;quot; isExecutable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;startEvent id=&amp;quot;StartEvent_1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;laneSet id=&amp;quot;ls_6-438&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;lane id=&amp;quot;_6-650&amp;quot; name=&amp;quot;clerk&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;OrderReceivedEvent&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-652&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-674&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;CalmCustomerTask&amp;lt;/flowNodeRef&amp;gt;        &lt;br /&gt;
      &amp;lt;/lane&amp;gt;&lt;br /&gt;
      &amp;lt;lane id=&amp;quot;_6-446&amp;quot; name=&amp;quot;pizza chef&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-463&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
      &amp;lt;/lane&amp;gt;&lt;br /&gt;
      &amp;lt;lane id=&amp;quot;_6-448&amp;quot; name=&amp;quot;delivery boy&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-514&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-565&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
        &amp;lt;flowNodeRef&amp;gt;_6-616&amp;lt;/flowNodeRef&amp;gt;&lt;br /&gt;
      &amp;lt;/lane&amp;gt;&lt;br /&gt;
    &amp;lt;/laneSet&amp;gt;&lt;br /&gt;
  &amp;lt;/process&amp;gt;&lt;br /&gt;
  &amp;lt;bpmndi:BPMNDiagram id=&amp;quot;BPMNDiagram_1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;bpmndi:BPMNPlane id=&amp;quot;BPMNPlane_1&amp;quot; bpmnElement=&amp;quot;_6-1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;_BPMNShape_StartEvent_2&amp;quot; bpmnElement=&amp;quot;StartEvent_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;omgdc:Bounds x=&amp;quot;152&amp;quot; y=&amp;quot;102&amp;quot; width=&amp;quot;36&amp;quot; height=&amp;quot;36&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmndi:BPMNPlane&amp;gt;&lt;br /&gt;
  &amp;lt;/bpmndi:BPMNDiagram&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&amp;lt;/kroki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://wiki.developer.olsztyn.pl/index.php?title=Vim:_settings&amp;diff=3</id>
		<title>Vim: settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.developer.olsztyn.pl/index.php?title=Vim:_settings&amp;diff=3"/>
		<updated>2026-05-19T14:09:34Z</updated>

		<summary type="html">&lt;p&gt;Administrator: 1 wersja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bellow is my experimental vim settings inspired by samples found on internet and actually included in my .vimrc:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
colorscheme industry&lt;br /&gt;
syntax on&lt;br /&gt;
filetype on&lt;br /&gt;
filetype plugin on&lt;br /&gt;
filetype indent on&lt;br /&gt;
set nocompatible&lt;br /&gt;
set number&lt;br /&gt;
set cursorline&lt;br /&gt;
set cursorcolumn&lt;br /&gt;
set ignorecase&lt;br /&gt;
set nobackup&lt;br /&gt;
set tabstop=4&lt;br /&gt;
set shiftwidth=4&lt;br /&gt;
set expandtab&lt;br /&gt;
set scrolloff=10&lt;br /&gt;
set laststatus=2&lt;br /&gt;
&lt;br /&gt;
set statusline=%&amp;lt;%f%m\ \[%{&amp;amp;ff}:%{&amp;amp;fenc}:%Y]\ %{getcwd()}\ \ \[%{strftime(&#039;%Y-%b-%d\ %a\ %I:%M\ %p&#039;)}\]\ %=\ Line:%l\/%L\ Column:%c%V\ %P&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
</feed>