Π˜ΡΡ‚ΠΈΠ½Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ систСму Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, исходя ΠΈΠ· устройства Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

ΠœΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌΡƒ Java ΠΈ Spring, Π² Ρ‚ΠΎΠΌ числС, Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. БСгодня ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ структура Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ ΠΊΠΎΠ΄ Java, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ это дСлаСтся, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π’ этой довольно Π·Π°ΠΏΠΎΠ·Π΄Π°Π»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я объясню, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ практичСски Π²ΠΎ всСх случаях модСль Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ «исходя ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…Β», Π° Π½Π΅ «исходя ΠΈΠ· возмоТностСй JavaΒ» (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ клиСнтского языка, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅). Выбирая Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π²Ρ‹ вступаСтС Π½Π° Π΄ΠΎΠ»Π³ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ Π±ΠΎΠ»ΠΈ ΠΈ страданий, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ расти.

Π‘Ρ‚Π°Ρ‚ΡŒΡ написана ΠΏΠΎ ΠΌΠΎΡ‚ΠΈΠ²Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ вопроса, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° Stack Overflow.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ обсуТдСния Π½Π° reddit Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… /r/java ΠΈ /r/programming.

ГСнСрация ΠΊΠΎΠ΄Π°

Насколько ΠΆΠ΅ я удивился, Ρ‡Ρ‚ΠΎ сущСствуСт такая нСбольшая прослойка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, познакомившись с jOOQ, Π²ΠΎΠ·ΠΌΡƒΡ‰Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ jOOQ Π²ΡΠ΅Ρ€ΡŒΠ΅Π· полагаСтся Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ исходного ΠΊΠΎΠ΄Π°. Никто Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jOOQ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ считаСтС Π½ΡƒΠΆΠ½Ρ‹ΠΌ, ΠΈ Π½Π΅ заставляСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π°. Но ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ описано Π² руководствС) Ρ€Π°Π±ΠΎΡ‚Π° с jOOQ происходит Ρ‚Π°ΠΊ: Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ с (унаслСдованной) схСмы Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, выполняСтС Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° jOOQ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ классов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ваши Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ типобСзопасныС запросы ΠΊ этим Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π½Π° 
//   основании сгСнСрированного ΠΊΠΎΠ΄Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅
// Π½ΠΈΠΆΠ΅ условиС SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгСнСрированныС ΠΈΠΌΠ΅Π½Π°
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

Код гСнСрируСтся ΠΈΠ»ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ сборки, ΠΈΠ»ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборкС. НапримСр, такая рСгСнСрация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ сразу послС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Flyway, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ автоматичСски.

ГСнСрация исходного ΠΊΠΎΠ΄Π°

Π‘ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° – Ρ€ΡƒΡ‡Π½Ρ‹ΠΌΠΈ ΠΈ автоматичСскими – связаны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ философии, прСимущСства ΠΈ нСдостатки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅. Но, Π² Ρ†Π΅Π»ΠΎΠΌ, вся ΡΡƒΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт воспроизвСсти Π½Π° Java Ρ‚Ρƒ «истину», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΠΎΡΡ‚ΡŒ, Π»ΠΈΠ±ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нашСй систСмы, Π»ΠΈΠ±ΠΎ Π²Π½Π΅ Π΅Π΅. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС, Ρ‚ΠΎ ΠΆΠ΅ самоС Π΄Π΅Π»Π°ΡŽΡ‚ компиляторы, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΈΠ΄ ΠΊΠΎΠ΄Π° Π½Π° основС исходников – ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ прСдставлСниС нашСй «истины» Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, нСзависимо ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½.

БущСствуСт мноТСство Ρ‚Π°ΠΊΠΈΡ… Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°. НапримСр, XJC ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Java Π½Π° основС Ρ„Π°ΠΉΠ»ΠΎΠ² XSD ΠΈΠ»ΠΈ WSDL. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ всСгда ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²:

  • БущСствуСт нСкая истина (внутрСнняя ΠΈΠ»ΠΈ внСшняя) – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, спСцификация, модСль Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚.Π΄.
  • Нам трСбуСтся локальноС прСдставлСниС Π΄Π°Π½Π½ΠΎΠΉ истины Π½Π° нашСм языкС программирования.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ прСдставлСниС ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π±Ρ‹Π²Π°Π΅Ρ‚ цСлСсообразно – Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ избыточности.

ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ

На Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ: Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½, Π±ΠΎΠ»Π΅Π΅ соврСмСнный ΠΈ спСцифичный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° для jOOQ связан с использованиСм ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ², Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² F#. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΊΠΎΠ΄ гСнСрируСтся компилятором, собствСнно Π½Π° этапС компиляции. Π’ Π²ΠΈΠ΄Π΅ исходников Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ сущСствуСт. Π’ Java ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ схоТиС, хотя ΠΈ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ изящныС инструмСнты – это процСссоры Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Lombok.

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ смыслС, здСсь происходят Ρ‚Π΅ ΠΆΠ΅ Π²Π΅Ρ‰ΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ:

  • Π’Ρ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ сгСнСрированного ΠΊΠΎΠ΄Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, такая ситуация ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ каТСтся Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ?)
  • Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, «истина» всСгда Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ доступна. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ Π² случаС Lombok, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ β€œΠΈΡΡ‚ΠΈΠ½Ρƒβ€. Π§ΡƒΡ‚ΡŒ слоТнСС с модСлями Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π±ΠΎΡ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит ΠΎΡ‚ постоянно доступного ΠΆΠΈΠ²ΠΎΠ³ΠΎ соСдинСния.

Π’ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠ΄Π°?

ΠšΡ€ΠΎΠΌΠ΅ Ρ…ΠΈΡ‚Ρ€ΠΎΠ³ΠΎ вопроса ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° – Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ автоматичСски, приходится ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ люди, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅, Ρ‡Ρ‚ΠΎ гСнСрация ΠΊΠΎΠ΄Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Π°. ОбоснованиС Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ попадалось ΠΌΠ½Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто – Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° слоТно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ сборки. Π”Π°, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТно. Π’ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инфраструктурныС ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ. Если Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ (Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ jOOQ, ΠΈΠ»ΠΈ JAXB, ΠΈΠ»ΠΈ Hibernate, Ρ‚.Π΄.), Π½Π° настройку Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ срСды ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ самого API, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ.

Если слишком Π²Π΅Π»ΠΈΠΊΠΈ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ, связанныС с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² устройствС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° – Ρ‚ΠΎ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π² API ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π½Π°Π΄ ΡŽΠ·Π°Π±ΠΈΠ»ΠΈΡ‚ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° (Π° Π² дальнСйшСм оказываСтся, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ настройка Π² Π½Π΅ΠΌ слоТна). Удобство использования Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ для любого Ρ‚Π°ΠΊΠΎΠ³ΠΎ API. Но это всСго лишь ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΈΡΠ°Ρ‚ΡŒ локальноС прСдставлСниС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΈΠ»ΠΈ внСшнСй истины.

МногиС скаТут, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ всСм этим Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ. Π£ Π½ΠΈΡ… горят сроки сдачи ΠΏΠΎ ΠΈΡ… Π‘ΡƒΠΏΠ΅Ρ€-ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ. Когда-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΡ‡Π΅ΡˆΠ΅ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ сборки, успССтся. Π― ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‡Ρƒ:

Π˜ΡΡ‚ΠΈΠ½Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ систСму Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, исходя ΠΈΠ· устройства Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π», Алан О’Π ΡƒΡ€ΠΊ, Audience Stack

Но Π² Hibernate / JPA Ρ‚Π°ΠΊ просто ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Β«ΠΏΠΎΠ΄ JavaΒ».

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Для Hibernate ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ это ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π±Π»Π°Π³ΠΎ, ΠΈ ΠΏΡ€ΠΎΠΊΠ»ΡΡ‚ΡŒΠ΅. Π’ Hibernate ΠΌΠΎΠΆΠ½ΠΎ просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ сущностСй, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

	@Entity
class Book {
  @Id
  int id;
  String title;
}

И ΠΏΠΎΡ‡Ρ‚ΠΈ всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ΄Π΅Π» Hibernate – Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слоТныС Β«Π΄Π΅Ρ‚Π°Π»ΠΈΒ» Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ эта ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π° DDL вашСго Β«Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π°Β» SQL:

	CREATE TABLE book (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  title VARCHAR(50),
 
  CONSTRAINT pk_book PRIMARY KEY (id)
);
 
CREATE INDEX i_book_title ON book (title);

… ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π³ΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ крутая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ.

Однако, ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅. Π― слукавил.

  • А Hibernate Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этого ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°?
  • А Hibernate создаст индСкс Π² TITLE? – я Ρ‚ΠΎΡ‡Π½ΠΎ знаю, ΠΎΠ½ Π½Π°ΠΌ понадобится.
  • A Hibernate Ρ‚ΠΎΡ‡Π½ΠΎ сдСлаСт этот ΠΊΠ»ΡŽΡ‡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π² Identity Specification?

ВСроятно, Π½Π΅Ρ‚. Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с нуля, Ρ‚ΠΎ всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ просто ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊ, ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Book Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π²ΠΈΠ΄:

	@Entity
@Table(name = "book", indexes = {
  @Index(name = "i_book_title", columnList = "title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
  String title;
}

ΠšΡ€ΡƒΡ‚ΠΎ. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π½Π° стартС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ.

Но впослСдствии Π·Π° это придСтся Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ

Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ придСтся Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½. ИмСнно Ρ‚ΠΎΠ³Π΄Π° такая модСль пСрСстанСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:

Π’ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΡƒΠΆΠ΅ нСльзя Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ нСобходимости ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ всС с чистого листа. Π’Π°ΡˆΠ° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… прСвратится Π² ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡƒΡŽ.

ΠžΡ‚Π½Ρ‹Π½Π΅ ΠΈ навсСгда Π²Π°ΠΌ придСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ скрипты DDL, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Flyway. А Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ с вашими сущностями? Π’Ρ‹ смоТСтС Π»ΠΈΠ±ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (ΠΈ Ρ‚Π°ΠΊ ΡƒΠ΄Π²ΠΎΠΈΡ‚Π΅ сСбС объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹), Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Hibernate Π·Π°Π½ΠΎΠ²ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для вас (насколько Π²Π΅Π»ΠΈΠΊΠΈ ΡˆΠ°Π½ΡΡ‹, Ρ‡Ρ‚ΠΎ сгСнСрированный Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ вашим оТиданиям?) Π’Ρ‹ Π² любом случаС ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚Π΅.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚Π΅ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½, Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ горячиС ΠΏΠ°Ρ‚Ρ‡ΠΈ. А ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½ ΠΎΡ‡Π΅Π½ΡŒ быстро. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΆΠ΅ Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ ΠΈ Π½Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π° Π³Π»Π°Π΄ΠΊΡƒΡŽ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Π°ΡˆΠΈΡ… ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ, Π²Ρ‹ всС Π΄ΠΈΠΊΠΎ ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΠ²Π°Π΅Ρ‚Π΅. А Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΆΠ΅ Π½Π΅ успСваСтС всС ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. И Ρ€ΡƒΠ³Π°Π΅Ρ‚Π΅ Hibernate, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всСгда Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚ ΠΊΡ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ вы…

ВмСсто этого, с самого Π½Π°Ρ‡Π°Π»Π° всС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ½Π°Ρ‡Π΅. НапримСр, ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° вСлосипСд ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ колСса.

Π‘Π½Π°Ρ‡Π°Π»Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…

Настоящая «истина» Π² схСмС вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ «сувСрСнитСт» Π½Π°Π΄ Π½Π΅ΠΉ кроСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Ρ…Π΅ΠΌΠ° опрСдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² самой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½ΠΈΠ³Π΄Π΅ большС, ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ копия этой схСмы, поэтому ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ цСлСсообразно Π½Π°Π²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ соблюдСниС схСмы ΠΈ Π΅Π΅ цСлостности, Π΄Π΅Π»Π°Ρ‚ΡŒ это прямо Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… – Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΈ хранится информация.
Π­Ρ‚ΠΎ старая Π΄Π°ΠΆΠ΅ избитая ΠΌΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ – это Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ – Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ – Ρ…ΠΎΡ€ΠΎΡˆΠΎ. УтвСрТдСния – Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, это Π΅Ρ‰Π΅ Π½Π΅ всС. НапримСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Oracle, Π²Ρ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ:

  • Π’ ΠΊΠ°ΠΊΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ пространствС находится ваша Ρ‚Π°Π±Π»ΠΈΡ†Π°
  • КакоС Ρƒ Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PCTFREE
  • Каков Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша Π² вашСй ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ)

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, всС это ΠΈ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ Π² ΠΌΠ°Π»Ρ‹Ρ… систСмах, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Β«Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…Β» β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ прСдоставляСмых поставщиком ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ хранСния Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ упомянутыС Π²Ρ‹ΡˆΠ΅. Ни ΠΎΠ΄Π½Π° ΠΈΠ· ORM, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ½Π΅ доводилось Π²ΠΈΠ΄Π΅Ρ‚ΡŒ (Π² Ρ‚ΠΎΠΌ числС, jOOQ) Π½Π΅ обСспСчиваСт доступа ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ ΠΎΠΏΡ†ΠΈΠΉ DDL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² вашСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ORM ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ DDL.

Но, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Ρ…ΠΎΡ€ΠΎΡˆΠΎ спроСктированная схСма Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ написана Π½Π° DDL. Π›ΡŽΠ±ΠΎΠΉ сгСнСрированный DDL являСтся лишь Π΅Π΅ аппроксимациСй.

Π§Ρ‚ΠΎ насчСт клиСнтской ΠΌΠΎΠ΄Π΅Π»ΠΈ?

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π²Π°ΠΌ потрСбуСтся копия схСмы вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, клиСнтскоС прСдставлСниС. ИзлишнС ΡƒΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это клиСнтскоС прСдставлСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ синхронизировано с Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ модСлью. Как Π»ΡƒΡ‡ΡˆΠ΅ всСго этого Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ? ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π°.

ВсС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ свою ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· SQL. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π°Ρ… SQL:

	-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
 
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
 
-- Oracle
SELECT owner, table_name
FROM all_tables
 
-- SQLite
SELECT name
FROM sqlite_master
 
-- Teradata
SELECT databasename, tablename
FROM dbc.tables

Π­Ρ‚ΠΈ запросы (ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΈΠΌ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, приходится Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ прСдставлСния, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ прСдставлСния, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ) Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° DatabaseMetaData.getTables() ΠΈΠ· JDBC, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚Π°-модуля jOOQ.

Из Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… запросов ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любоС клиСнтскоС прСдставлСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая тСхнология ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρƒ вас Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

  • Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ JDBC ΠΈΠ»ΠΈ Spring, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ строковых констант
  • Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ JPA, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сами сущности
  • Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ jOOQ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°-модСль jOOQ

Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ объСм возмоТностСй прСдлагаСтся вашим клиСнтским API (Π½Π°ΠΏΡ€. jOOQ ΠΈΠ»ΠΈ JPA), сгСнСрированная ΠΌΠ΅Ρ‚Π°-модСль ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ-настоящСму насыщСнной ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, хотя Π±Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ нСявных объСдинСний, ΠΏΠΎΡΠ²ΠΈΠ²ΡˆΡƒΡŽΡΡ Π² jOOQ 3.11, которая опираСтся Π½Π° ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ вашими Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ любоС ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ обновлСнию клиСнтского ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ALTER TABLE book RENAME COLUMN title TO book_title;

Π’Ρ‹ Π² самом Π΄Π΅Π»Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π²Π°ΠΆΠ΄Ρ‹? Ни Π² ΠΊΠΎΠ΅ΠΌ случаС. ΠŸΡ€ΠΎΡΡ‚ΠΎ фиксируСм DDL, прогоняСм Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· ваш ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ сборки ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ:

@Entity
@Table(name = "book", indexes = {
 
  // Π’Ρ‹ ΠΎΠ± этом Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ?
  @Index(name = "i_book_title", columnList = "book_title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
 
  @Column("book_title")
  String bookTitle;
}

Π›ΠΈΠ±ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ класс jOOQ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ DDL Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° сСмантикС, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° синтаксисС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² скомпилированном ΠΊΠΎΠ΄Π΅, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ) Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

ЕдинствСнная истина

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ, всСгда Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° модСль, которая являСтся СдинствСнным источником истины для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ подсистСмы – ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊ этому ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ ΠΈ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ enterprise-ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹, Π³Π΄Π΅ «истина» сразу Π²Π΅Π·Π΄Π΅ ΠΈ Π½ΠΈΠ³Π΄Π΅. ВсС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅. Если Π²Ρ‹ всСго лишь ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ XML-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ с ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ систСмой, просто ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ XSD. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΌΠ΅Ρ‚Π°-модСль INFORMATION_SCHEMA ΠΈΠ· jOOQ Π² XML-Ρ„ΠΎΡ€ΠΌΠ΅:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD Ρ…ΠΎΡ€ΠΎΡˆΠΎ понятна
  • XSD ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ XML ΠΈ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ Π½Π° всСх клиСнтских языках
  • XSD Ρ…ΠΎΡ€ΠΎΡˆΠΎ вСрсионируСтся ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ€Π°Π·Π²ΠΈΡ‚ΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ
  • XSD ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄ Java ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ XJC

ПослСдний ΠΏΡƒΠ½ΠΊΡ‚ Π²Π°ΠΆΠ΅Π½. ΠŸΡ€ΠΈ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ с внСшнСй систСмой ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ XML-сообщСний ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² валидности Π½Π°ΡˆΠΈΡ… сообщСний. Π­Ρ‚ΠΎΠ³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JAXB, XJC ΠΈ XSD. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π±Π΅Π·ΡƒΠΌΠΈΠ΅ΠΌ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ «сначала JavaΒ», Π³Π΄Π΅ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ наши сообщСния Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Java, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ внятно ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π½Π° XML ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ для потрСблСния Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму. XML, сгСнСрированный Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±Ρ‹Π» Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ качСства, Π½Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ Π΅Π³ΠΎ слоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ. Если Π±Ρ‹ ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ интСрфСйсу сущСствовало соглашСниС ΠΎΠ± ΡƒΡ€ΠΎΠ²Π½Π΅ качСства обслуТивания (SLA), ΠΌΡ‹ Π±Ρ‹ сразу Π΅Π³ΠΎ Π·Π°ΠΏΠΎΡ€ΠΎΠ»ΠΈ.

ЧСстно говоря, ΠΈΠΌΠ΅Π½Π½ΠΎ это постоянно ΠΈ происходит с API Π½Π° JSON, Π½ΠΎ это ΡƒΠΆΠ΅ другая история, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΏΠΎΡ€ΡƒΠ³Π°ΡŽΡΡŒβ€¦

Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: это ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅

Работая с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΏΠΎΡ…ΠΎΠΆΠΈ. Π‘Π°Π·Π° Π²Π»Π°Π΄Π΅Π΅Ρ‚ своими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ схСмой. Π›ΡŽΠ±Ρ‹Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, вносимыС Π² схСму, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно Π½Π° DDL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ обновлялся Π΅Π΄ΠΈΠ½Ρ‹ΠΉ источник истины.

Когда ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ источника ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, всС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ свои ΠΊΠΎΠΏΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. НСкоторыС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ написаны Π½Π° Java с использованиСм jOOQ ΠΈ Hibernate ΠΈΠ»ΠΈ JDBC (ΠΈΠ»ΠΈ всСх сразу). Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ написаны Perl (остаСтся ΠΏΠΎΠΆΠ΅Π»Π°Ρ‚ΡŒ ΠΈΠΌ ΡƒΠ΄Π°Ρ‡ΠΈ), Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈ – Π½Π° C#. Π­Ρ‚ΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ. Главная модСль находится Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. МодСли, сгСнСрированныС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ORM, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ качСства, ΠΏΠ»ΠΎΡ…ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, ΠΈ ΠΈΡ… слоТно Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΠΉΡ‚Π΅ ошибок. Π‘ самого Π½Π°Ρ‡Π°Π»Π° Π½Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΠΉΡ‚Π΅ ошибок. Π Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅, исходя ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ развСртывания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹. И ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΊΠΎΠ΄Π°. Они Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅. Π‘ Π½ΠΈΠΌΠΈ Π²Ρ‹ станСтС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½Π΅Π΅. НуТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с самого Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡ… настройку – ΠΈ Π΄Π°Π»Π΅Π΅ вас ΠΆΠ΄ΡƒΡ‚ Π³ΠΎΠ΄Ρ‹ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слоТится история вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Пока Π½Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈΡ‚Π΅, ΠΏΠΎΡ‚ΠΎΠΌ.

ПояснСниС

Для ясности: Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ ΠΏΡ€ΠΎΠΏΠ°Π³Π°Π½Π΄ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ модСль вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³ΠΈΠ±Π°Ρ‚ΡŒ всю систСму (Ρ‚.Π΅., ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ‚.Π΄., Ρ‚.ΠΏ). Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ клиСнтский ΠΊΠΎΠ΄, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΌ самом Π½Π΅ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ модСль Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² статусС Β«ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса». Вакая Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ располагаСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Ρƒ вас Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

Π’ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΊΠΎΠ΅-Π³Π΄Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ, такая модСль систСмы ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ СдинствСнно Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ. Однако Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ доступа Π΄Π°Π½Π½Ρ‹Ρ… каТСтся ΠΌΠ½Π΅ «подсистСмой», ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ модСль Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Из любого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΅ΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈ я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ исходного ΠΊΠΎΠ΄Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСподходящим. Π’ΠΎΡ‚ ΠΏΠ°Ρ€Π° Ρ‚Π°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (вСроятно, найдутся ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅):

  • Когда схСма нСизвСстна, ΠΈ Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ. НапримСр, Π²Ρ‹ поставщик инструмСнта, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² любой схСмС. Π£Ρ„. Π’ΡƒΡ‚ Π±Π΅Π· Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Но всС Ρ€Π°Π²Π½ΠΎ – Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго.
  • Когда схСма Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π»Π΅Ρ‚Ρƒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ каТСтся слСгка Π²Ρ‹Ρ‡ΡƒΡ€Π½ΠΎΠΉ вСрсиСй ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° entity attribute value, Ρ‚.Π΅., Ρƒ вас Π² самом Π΄Π΅Π»Π΅ Π½Π΅Ρ‚ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ схСмы. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π΄Π°ΠΆΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ нСльзя Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Π Π‘Π£Π‘Π”.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ своСй ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, связанных с использованиСм Π Π‘Π£Π‘Π”, схСма извСстна Π·Π°Ρ€Π°Π½Π΅Π΅, ΠΎΠ½Π° находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π Π‘Π£Π‘Π” ΠΈ являСтся СдинствСнным источником «истины», Π° всСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ приходится ΠΎΠ±Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ копиями, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Π½Π΅Π΅. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ ΠΏΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com