Ko te pono tuatahi, he aha ranei me hoahoa te punaha i runga i te taputapu raraunga

Hei Habr!

Ka torotoro tonu matou i te kaupapa Java и Springtae atu ki te taumata raraunga. I tenei ra ka panui matou mo te aha, i te wa e hoahoa ana i nga tono nui, ko te hanganga putunga korero, kaua ko te waehere Java, he mea tino nui, me pehea te mahi, he aha nga tuunga o tenei ture.

I roto i tenei tuhinga kua roa rawa, ka whakamaramatia e au he aha ahau i whakaaro ai i roto i te nuinga o nga keehi, ko te tauira raraunga i roto i tetahi tono me hoahoa "mai i te paataka raraunga" kaua ki te "mai i nga kaha o Java" (he aha te reo o te kiritaki kei a koe. mahi tahi). Ma te whiriwhiri i te huarahi tuarua, ka uru koe ki te huarahi roa o te mamae me te mamae ka timata to kaupapa ki te tipu.

I tuhia te tuhinga i runga i kotahi te patai, hoatu i runga i Stack Overflow.

Nga korero whakamere mo reddit i nga waahanga /r/java и /r/whakahōtaka.

Te whakaputa waehere

Ka miharo ahau he iti nei te paparanga o nga kaiwhakamahi, kua mohio ki te jOOQ, ka whakaparahako ki te meka e tino whakawhirinaki ana a jOOQ ki te whakaputa waehere puna hei whakahaere. Kaore he tangata e aukati i a koe ki te whakamahi i te jOOQ kia rite ki taau e pai ai, kaore hoki tetahi e akiaki ana i a koe ki te whakamahi i te hanga waehere. Engari ma te taunoa (penei i te whakaahuatanga i roto i te pukapuka), ka penei te mahi a jOOQ: ka tiimata koe me te kaupapa (taonga tuku iho) papaa raraunga, whakahurihia me te kaihanga waehere jOOQ ki te tiki i tetahi huinga karaehe e tohu ana i o ripanga, katahi ka tuhi momo- nga patai haumaru mo enei ripanga:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Информация о типах выведена на 
//   основании сгенерированного кода, на который ссылается приведенное
// ниже условие SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгенерированные имена
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

Ko te waehere ka hangaia ma te ringa i waho o te hanga, ma te ringa ranei i runga i ia hangahanga. Hei tauira, ka whai muri tonu taua whakaoranga Ko te hekenga o te paparangi raraunga Rererangi, ka taea hoki te mahi a-ringa, aunoa ranei.

Te whakaputanga waehere puna

He maha nga whakaaro, nga painga me nga ngoikoretanga e pa ana ki enei huarahi ki te hanga waehere - a-ringa me te aunoa - kaore au e korero taipitopito i roto i tenei tuhinga. Engari, i te nuinga o te waa, ko te tohu katoa o te waehere kua hangaia ko te mea ka taea e koe te whakaputa i roto i te Java te "pono" ka tangohia noa e matou, i roto i to maatau punaha, i waho ranei. Ko te tikanga, ko nga kaikoipi e whakaputa ana i te bytecode, i te waehere miihini, i etahi atu momo waehere mai i te waehere puna ka mahi ano - ka whiwhi tatou i te tohu o to tatou "pono" i roto i tetahi atu reo, ahakoa he aha nga take.

He maha nga kaihanga waehere penei. Hei tauira, Ka taea e XJC te whakaputa waehere Java i runga i nga konae XSD, WSDL ranei. He rite tonu te kaupapa:

  • He pono (roto, waho ranei) - hei tauira, he tohu, he tauira raraunga, aha atu.
  • E hiahia ana matou ki te whakaatu i tenei pono i roto i to maatau reo hotaka.

I tua atu, ko te nuinga o nga wa katoa he pai ki te whakaputa i taua ahua - kia kore ai e mahi.

Momo Kaituku me te Tukatuka Tukatuka

Tuhipoka: Ko tetahi atu huarahi hou me te motuhake mo te whakaputa waehere mo te jOOQ ko te whakamahi i nga kaiwhakarato momo, i te mea e whakatinanahia ana i roto i te F#. I roto i tenei take, ka hangaia te waehere e te kaitoha, i te wa o te kohinga. Ko te tikanga, karekau taua waehere i te ahua o nga waehere puna. I roto i te Java, he rite tonu, ahakoa ehara i te mea huatau, nga taputapu - he tukatuka tuhipoka enei, hei tauira, Lombok.

I roto i tetahi tikanga, ka rite nga mea i konei penei i te keehi tuatahi, engari:

  • Kaore koe e kite i te waehere i hangaia (penei pea kaore tenei ahuatanga e tino kino ki tetahi?)
  • Me whakarite ka taea te whakarato momo, ara, "pono" me watea tonu. He ngawari tenei i roto i te take o Lombok, e tohu ana i te "pono". He iti ake te uaua ki nga tauira raraunga e whakawhirinaki ana ki te hononga ora e waatea ana i nga wa katoa.

He aha te raruraru ki te hanga waehere?

I tua atu i te patai uaua me pehea te pai ake ki te tiimata i te whakaputanga waehere - ma te ringa, ma te aunoa ranei, me kii atu ahau kei reira nga tangata e whakapono ana kaore e hiahiatia te whakaputanga waehere. Ko te tika mo tenei tirohanga, i kitea e au i te nuinga o nga wa, he uaua ki te whakarite i te paipa hanga. Ae, he tino uaua. He utu hangahanga taapiri. Mena kei te timata koe ki tetahi hua (ahakoa jOOQ, JAXB ranei, Hibernate, me etahi atu), ka roa te wa ki te whakarite i tetahi papamahi e hiahia ana koe ki te ako i te API ake kia whai hua ai .

Mena he nui rawa nga utu e pa ana ki te mohio ki te taputapu o te kaihanga, na, he pai te mahi a te API mo te whakamahinga o te kaihanga waehere (a i te wa kei te heke mai ka puta he uaua ano te whakaritenga i roto). Ko te whakamahinga te mea nui rawa atu mo tetahi API pera. Engari kotahi noa te tohenga ki te hanga waehere. Ki te kore, tuhia katoatia ma te ringaringa te whakaaturanga o te pono o roto, o waho ranei.

He tokomaha ka kii karekau he wa ki te mahi i enei mea katoa. Kei te wa mutunga mo a raatau Hua Super. I tetahi ra i muri mai ka heru tatou i nga kaikawe huihuinga, ka whai wa tatou. Ka whakahoki ahau ki a ratou:

Ko te pono tuatahi, he aha ranei me hoahoa te punaha i runga i te taputapu raraunga
Tuhinga, Alan O'Rourke, Te Tapae Kaitakitaki

Engari i roto i te Hibernate / JPA he tino ngawari ki te tuhi waehere "i Java".

Tino. Mo Hibernate me ona kaiwhakamahi, he pai tenei me te kanga. I roto i te Hibernate, ka taea e koe te tuhi noa i nga hinonga e rua, penei:

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

A kua rite nga mea katoa. Inaianei ko te nui o te Hibernate ko te whakaputa i nga "taipitopito" matatini mo te ahuatanga o tenei hinonga ki te DDL o to "reo" o 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);

... ka timata ki te whakahaere i te tono. He ahua tino pai ki te whakatika tere me te whakamatau i nga mea rereke.

Heoi, tukua ahau. I te teka ahau.

  • Ka whakamanahia e Hibernate te whakamaramatanga o tenei matua matua kua whakaingoatia?
  • Ka waihangahia e Hibernate he tohu mo TITLE? E tino mohio ana ahau kei te hiahia tatou.
  • Ka waiho e Hibernate tenei kī hei kī tuakiri i roto i te Whakatakotoranga Tuakiri?

Kaore pea. Mena kei te whakawhanake koe i to kaupapa mai i te wahanga, he watea ki te whakakore noa i te paataka raraunga tawhito me te whakaputa i tetahi mea hou ina taapirihia e koe nga korero e tika ana. Na, ko te hinonga Pukapuka ka mau te ahua:

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

Matahau. Whakahou. Ano, i tenei keehi, ka tino ngawari i te timatanga.

Engari me utu e koe a muri ake nei.

Ake ake nei ka haere koe ki te hanga. Ka mutu te mahi a te tauira. Nā te mea:

I roto i te hanga, ka kore e taea, ki te tika, ki te whakakore i te paataka tawhito me te timata i nga mea katoa mai i te wahanga. Ka huri to papaunga raraunga hei taonga tuku iho.

Mai i tenei wa a ake ake me tuhi koe Ko nga tuhinga hekenga DDL, hei tauira, te whakamahi i a Flyway. A ka aha ki o hinonga i tenei keehi? Ka taea e koe te whakawhaiaro a-ringa (me te whakawharua i to kawenga mahi) me tuku ranei a Hibernate ki te whakahou i a raatau mo koe (pehea te ahua o tenei huarahi ki te whakatutuki i o tumanako?) Ka ngaro koe.

No reira, ka neke koe ki te hanga, ka hiahia koe ki nga papanga wera. A me tere rawa te kawe mai ki te hanga. I te mea kaore koe i whakarite me te whakarite i te paipa paipa maeneene mo o hekenga mo te whakaputanga, kei te papaki mohoao koe. Na ka kore koe e whai wa ki te mahi tika i nga mea katoa. Na ka riria e koe a Hibernate, na te mea na tetahi te he, engari kaore koe ...

Engari, mai i te timatanga, he rereke nga mahi katoa. Hei tauira, whakanohohia nga wira porowhita ki runga paihikara.

Raraunga raraunga tuatahi

Ko te tino "pono" kei roto i to raupapatanga papaarangi me te "mananga rangatiratanga" kei runga kei roto i te paataka raraunga. Kua tautuhia te aronuinga anake i roto i te papaaarangi ake, kaore he waahi ke atu, a kei ia kaihoko he kape o tenei aronuinga, no reira he mea tino tika ki te whakamana i te piri ki te aronuinga me tona tapatahi, kia tika te mahi i roto i te paataka korero - kei hea te kei te rongoa nga korero.
Ko te whakaaro nui tawhito noa tenei. He pai nga taviri tuatahi me te ahurei. He pai nga taviri ke. He pai te arowhai here. Whakapuakanga - Pai.

A, ehara i te mea ko tera anake. Hei tauira, ma te whakamahi i a Oracle, ka hiahia pea koe ki te tohu:

  • He aha te mokowātea tepu kei roto
  • He aha tana uara PCTFREE
  • He aha te rahi o te keteroki i to raupapa (kei muri i te id)

Ko enei mea katoa kaore he mea nui i roto i nga punaha iti, engari kaore e tika kia tatari tae noa ki te whakawhiti ki te rohe o "raraunga nui" - ka taea e koe te timata ki te whai hua mai i nga arotautanga rokiroki e whakaratohia ana e te kaihoko, penei i nga korero i runga ake nei, i mua atu. Karekau tetahi o nga ORM i kite ahau (tae atu ki te jOOQ) e tuku urunga ki te huinga katoa o nga whiringa DDL ka hiahia pea koe ki te whakamahi i roto i to papaunga raraunga. Ka tukuna e nga ORM etahi taputapu hei awhina i a koe ki te tuhi DDL.

Engari i te mutunga o te ra, ka tuhia e te ringa-a-ringa tetahi kaupapa hoahoa ki te DDL. Ko nga DDL kua hangaia he tata noa.

He aha te tauira o te kiritaki?

Ka rite ki te korero i runga ake nei, i runga i te kiritaki ka hiahia koe ki te kape o to raupapatanga raraunga, te tirohanga a te kiritaki. Me kii, ko tenei tirohanga a te kiritaki me hono ki te tauira tuturu. He aha te huarahi pai ki te whakatutuki i tenei? Me te kaihanga waehere.

Ka whakaratohia e nga papaunga raraunga katoa a raatau korero-meta ma te SQL. Anei me pehea te tiki i nga ripanga katoa i roto i nga reo SQL rereke mai i to papaunga raraunga:

	-- 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

Ko enei patai (he rite ranei, i runga i te mea me whai whakaaro ano koe ki nga tirohanga, nga tirohanga hangahanga, nga mahi uara-tepu) ka mahia ma te waea DatabaseMetaData.getTables() mai i te JDBC, te whakamahi ranei i te jOOQ meta-module.

Mai i nga hua o enei patai, he ngawari noa ki te whakaputa i tetahi tohu taha-kiritaki o to tauira paparangi raraunga, ahakoa he aha te hangarau e whakamahia ana e koe ki te kaihoko.

  • Mena kei te whakamahi koe i te JDBC, i te Puna ranei ka taea e koe te hanga i tetahi huinga aho tonu
  • Mena kei te whakamahi koe i te JPA, ka taea e koe te whakaputa i nga hinonga ake
  • Mena kei te whakamahi koe i te jOOQ ka taea e koe te whakaputa tauira meta jOOQ

I runga i te nui o te mana ka tukuna e to kiritaki API (hei tauira, jOOQ, JPA ranei), ka tino whai rawa, ka oti te tauira meta kua hangaia. Tangohia, hei tauira, te taea o te hono implicit, i whakauruhia ki te jOOQ 3.11, e whakawhirinaki ana ki nga korero-meta kua hangaia mo nga hononga matua o tawahi i waenga i o ripanga.

Inaianei ka whakahōu aunoatia te waehere kiritaki te pikinga pātengi raraunga. Whakaarohia hei tauira:

ALTER TABLE book RENAME COLUMN title TO book_title;

Ka tino hiahia koe ki te mahi i tenei mahi kia rua? Kaore he take. Ka tukuna noa e matou te DDL, ka whakahaere i to paipa hanga, ka whiwhi i te hinonga kua whakahoutia:

@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;
}

Ko te akomanga jOOQ ranei kua whakahoutia. Ko te nuinga o nga huringa DDL e pa ana ki nga tohutoro, ehara i te wetereo noa. Na reira, he watea ki te kite i roto i te waehere kua whakahiato he aha te waehere ka pa (ka pa) ma te whakanui ake i to papaunga raraunga.

Ko te pono anake

Ahakoa he aha te hangarau e whakamahia ana e koe, he tauira kotahi anake te puna o te pono mo etahi puunaha iti - me whai ranei tatou mo tenei me te karo i te raruraru hinonga kei hea te "pono" i nga waahi katoa, i nga waahi katoa. Ka ngawari ake nga mea katoa. Mena kei te whakawhiti noa koe i nga konae XML me etahi atu punaha, whakamahia noa te XSD. Tirohia te INFORMATION_SCHEMA tauira-meta a jOOQ i te ahua XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • Kei te tino marama te XSD
  • He pai te tohu a XSD i nga ihirangi XML me te whakamana i nga reo o nga kaihoko katoa
  • He pai te putanga o XSD me te tino hototahi whakamuri
  • Ka taea te whakamaori i te XSD ki te waehere Java ma te whakamahi i te XJC

He mea nui te pito whakamutunga. I te wa e korero ana ki tetahi punaha o waho ma te whakamahi i nga karere XML, me tino mohio kei te whai mana a maatau karere. He tino ngawari tenei ki te whakatutuki me JAXB, XJC me XSD. He tino porangi ki te whakaaro, i roto i te huarahi hoahoa Java-tuatahi i hanga ai a tatou karere hei taonga Java, ka taea te tuku marama ki te XML ka tukuna kia kai ki tetahi atu punaha. Ko te XML ka hangaia i tenei ara he tino rawe te kounga, kaore he tuhinga, he uaua ki te whakawhanake. Mena he whakaaetanga mo te taumata o te kounga o te ratonga (SLA) i runga i taua atanga, ka pakaru tonu taatau.

Ki te pono, koinei tonu te mea e tupu ana i nga wa katoa me te JSON API, engari he korero ano tera, ka tohe ahau a muri ake nei ...

Raraunga: he rite tonu

Ma te mahi tahi me nga papaa raraunga, ka mohio koe he rite katoa. Kei te pātengi raraunga ana raraunga me whakahaere te aronuinga. Ko nga whakarereketanga i mahia ki te aronuinga me whakauru tika ki te DDL kia whakahoutia te puna kotahi o te pono.

I te wa i puta ai te whakahou puna, me whakahou ano nga kaihoko katoa i a raatau kape o te tauira. Ko etahi o nga kaihoko ka tuhia ki Java ma te whakamahi i te jOOQ me te Hibernate, te JDBC ranei (e rua ranei). Ko etahi atu kaihoko ka tuhia ki Perl (kia waimarie ratou), etahi atu ki C #. Kare he aha. Ko te tauira matua kei roto i te putunga. Ko nga tauira i hangaia e ORM he iti te kounga, he iti te tuhi, he uaua ki te whakawhanake.

No reira kaua e pohehe. Kaua e pohehe mai i te timatanga. Mahi mai i te pātengi raraunga. Hangaia he paipa tohatoha ka taea te mahi aunoa. Whakahohehia nga kaihanga waehere kia pai te kape i to tauira raraunga ka maka ki runga i nga kaihoko. A mutu te awangawanga mo nga kaihanga waehere. He pai ratou. Ma ratou, ka whai hua ake koe. Ko nga mea katoa hei mahi maau he wa poto ki te whakarite i a raatau mai i te tiimatanga, ka whai tau koe ki te whakapai ake i nga mahi ki te hanga korero mo to kaupapa.

Kaua ano e mihi ki ahau, a muri ake nei.

Whakamārama

Kia marama: Karekau tenei tuhinga e kii i te katoa o te punaha (arā, te rohe, te arorau pakihi, me etahi atu. Ko taku e korero nei i roto i tenei tuhinga ko te waehere kiritaki e pahekoheko ana me tetahi papaarangi me mahi i runga i te tauira o te papaarangi kia kore ai e whakaputahia te tauira paparangi i roto i te mana "akomanga tuatahi". Kei te nuinga o nga wa kei te paparanga urunga raraunga kei to kaihoko.

I roto i nga hoahoanga taumata-rua, e tiakina tonutia ana i etahi waahi, ko taua tauira punaha anake te mea ka taea. Heoi, i roto i te nuinga o nga punaha, ko te paparanga urunga raraunga ki ahau nei he "punaharoto" e whakakao ana i te tauira raraunga.

Tuhinga

He rereke nga ture katoa, a kua kii atu ahau i mua ko te papaunga raraunga tuatahi me te huarahi whakaputa waehere puna karekau pea i etahi wa. Anei etahi o enei momo rereke (kei kona ano etahi atu):

  • Ina kaore i te mohiotia te aronuinga me te whakatuwhera. Hei tauira, ka whakaratohia e koe he taputapu hei awhina i nga kaiwhakamahi ki te whakatere i tetahi hoahoa. Phew. Karekau he reanga waehere i konei. Engari tonu - ko te papaunga raraunga tuatahi.
  • Ina me hanga he ara iahiko i runga i te rere ki te whakaoti rapanga. Ko te ahua o tenei tauira he ahua pakupaku o te tauira uara huanga hinonga, arä, karekau he aronuinga kua tino tautuhia. I tenei keehi, kaore koe e tino mohio ka pai te RDBMS ki a koe.

He mea motuhake nga otahi. I roto i te nuinga o nga keehi e pa ana ki te whakamahi RDBMS, kua mohiohia te kaupapa i mua, kei roto i te RDBMS ko te puna anake o te "pono", me whiwhi kape katoa nga kaihoko mai i a ia. Ko te tikanga, me uru mai he kaihanga waehere.

Source: will.com

Tāpiri i te kōrero