1. Gambaran keseluruhan
Semasa membuat lapisan ketekunan, kita perlu memadankan skema pangkalan data SQL kita dengan model objek yang telah kita buat dalam kod kita. Ini boleh dilakukan banyak kerja secara manual.
Dalam tutorial ini, kita akan melihat bagaimana membuat dan mengeksport skema pangkalan data kami berdasarkan model entiti dari kod kami .
Pertama, kita akan merangkumi sifat konfigurasi JPA untuk pembuatan skema. Kemudian, kami akan meneroka cara menggunakan sifat ini di Spring Data JPA.
Akhirnya, kami akan mencari alternatif untuk generasi DDL menggunakan API asli Hibernate.
2. Penjanaan Skema JPA
JPA 2.1 memperkenalkan standard untuk pembuatan skema pangkalan data . Oleh itu, bermula dengan pelepasan ini kita dapat mengawal bagaimana menghasilkan dan mengeksport skema pangkalan data kita melalui satu set sifat konfigurasi yang telah ditentukan.
2.1. Tindakan Skrip
Pertama, untuk mengawal arahan DDL mana yang akan kami hasilkan , JPA memperkenalkan pilihan konfigurasi tindakan skrip :
javax.persistence.schema-generation.scripts.action
Kita boleh memilih dari empat pilihan yang berbeza:
- tidak - tidak menghasilkan arahan DDL
- buat - buat hanya arahan arahan membuat pangkalan data
- drop - menghasilkan hanya arahan drop database
- drop-and-create - menghasilkan arahan drop database diikuti dengan perintah create
2.2. Sasaran Skrip
Kedua, untuk setiap tindakan skrip yang ditentukan , kita perlu menentukan konfigurasi sasaran yang sesuai :
javax.persistence.schema-generation.scripts.create-target javax.persistence.schema-generation.scripts.drop-target
Pada dasarnya, sasaran skrip menentukan lokasi fail yang mengandungi perintah membuat atau menjatuhkan skema . Jadi, sebagai contoh, jika kita memilih drop-and-create sebagai tindakan skrip kita perlu menentukan kedua-dua target .
2.3. Sumber Skema
Akhirnya, untuk menghasilkan perintah DDL skema dari model entiti kami, kami harus memasukkan konfigurasi sumber skema dengan pilihan metadata yang dipilih:
javax.persistence.schema-generation.create-source=metadata javax.persistence.schema-generation.drop-source=metadata
Pada bahagian seterusnya, kami akan menunjukkan bagaimana kami dapat menggunakan Spring Data JPA untuk menghasilkan skema pangkalan data kami secara automatik dengan sifat JPA standard.
3. Penjanaan Skema dengan Spring Data JPA
3.1. Model
Bayangkan kita menerapkan sistem akaun pengguna dengan entiti yang dipanggil Akaun :
@Entity @Table(name = "accounts") public class Account { @Id @GeneratedValue private Long id; @Column(nullable = false, length = 100) private String name; @Column(name = "email_address") private String emailAddress; @OneToMany(mappedBy = "account", cascade = CascadeType.ALL) private List accountSettings = new ArrayList(); // getters and setters }
Setiap akaun boleh mempunyai beberapa tetapan akaun, jadi di sini kita akan melakukan pemetaan satu-ke-banyak:
@Entity @Table(name = "account_settings") public class AccountSetting { @Id @GeneratedValue private Long id; @Column(name = "name", nullable = false) private String settingName; @Column(name = "value", nullable = false) private String settingValue; @ManyToOne @JoinColumn(name, nullable = false) private Account account; // getters and setters }
3.2. Konfigurasi JPA Spring Data
Sekarang untuk menghasilkan skema pangkalan data, kita perlu menyampaikan sifat penghasilan skema kepada penyedia ketekunan yang sedang digunakan. Untuk melakukan ini, kami akan menetapkan sifat JPA asli dalam fail konfigurasi kami di bawah awalan spring.jpa.properties :
spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
Akibatnya, Spring Data JPA menyerahkan sifat-sifat ini kepada penyedia kegigihan , ketika membuat kacang EntityManagerFactory .
3.3. The create.sql Fail
Akibatnya, pada permulaan aplikasi, konfigurasi di atas akan menghasilkan arahan pembuatan pangkalan data berdasarkan metadata pemetaan entiti. Selanjutnya, perintah DDL dieksport ke dalam file create.sql , yang dibuat dalam folder projek utama kami:
create table account_settings ( id bigint not null, name varchar(255) not null, value varchar(255) not null, account_id bigint not null, primary key (id) ) create table accounts ( id bigint not null, email_address varchar(255), name varchar(100) not null, primary key (id) ) alter table account_settings add constraint FK54uo82jnot7ye32pyc8dcj2eh foreign key (account_id) references accounts (id)
4. Penjanaan Skema dengan API Hibernate
Sekiranya kita menggunakan Hibernate, kita dapat langsung menggunakan API asalnya, SchemaExport , untuk menghasilkan perintah DDL skema kita . Begitu juga, API Hibernate menggunakan model entiti aplikasi kami untuk menghasilkan dan mengeksport skema pangkalan data.
Dengan Hibernate's SchemaExport kita dapat menggunakan drop , createOnly, dan membuat kaedah secara eksplisit:
MetadataSources metadataSources = new MetadataSources(serviceRegistry); metadataSources.addAnnotatedClass(Account.class); metadataSources.addAnnotatedClass(AccountSettings.class); Metadata metadata = metadataSources.buildMetadata(); SchemaExport schemaExport = new SchemaExport(); schemaExport.setFormat(true); schemaExport.setOutputFile("create.sql"); schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), metadata);
Semasa kami menjalankan kod ini, perintah pembuatan pangkalan data kami dieksport ke dalam file create.sql di folder projek utama kami.
The SchemaExport adalah sebahagian daripada API Hibernate Bootstrap.
5. Pilihan Penjanaan Skema
Walaupun penghasilan skema dapat menjimatkan masa kita semasa pembangunan, kita harus menggunakannya hanya untuk senario asas.
Sebagai contoh, kita dapat menggunakannya untuk cepat mengembangkan pengembangan atau menguji pangkalan data.
Sebaliknya, untuk senario yang lebih kompleks, seperti migrasi pangkalan data, kita harus menggunakan perkakas yang lebih halus seperti Liquibase atau Flyway .
6. Kesimpulannya
Dalam tutorial ini, kami melihat bagaimana menghasilkan dan mengeksport skema pangkalan data kami dengan bantuan sifat penjanaan skema JPA . Selepas itu, kami melihat bagaimana mencapai hasil yang sama dengan menggunakan API asli Hibernate, SchemaExport .
Seperti biasa, kita dapat mencari contoh kod di GitHub.