Φόρτωση αρχικών δεδομένων με Spring Boot

0
Φόρτωση αρχικών δεδομένων με Spring Boot

Σε αυτό το άρθρο, θα εξετάσουμε τις επιλογές για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Θα εξετάσουμε τις διάφορες διαθέσιμες επιλογές με το Spring Boot.

Φόρτωση αρχικών δεδομένων με Spring Boot

Το Spring Boot διευκολύνει τη διαχείριση οποιουδήποτε τύπου αλλαγών στη βάση δεδομένων. Θα αναζητήσει οντότητες στα πακέτα μας και θα δημιουργήσει τους αντίστοιχους πίνακες εάν δεν ορίσουμε καμία προσαρμοσμένη διαμόρφωση και χρησιμοποιήσουμε την προεπιλεγμένη διαμόρφωση. Μπορούμε να χρησιμοποιήσουμε το data.sql και schema.sql αρχεία την άνοιξη για να αποκτήσετε περισσότερο έλεγχο στις αλλαγές της βάσης δεδομένων. Είναι ένα ισχυρό χαρακτηριστικό που σας επιτρέπει να εργάζεστε σε διαφορετικά περιβάλλοντα. Ας δούμε πώς να φορτώσετε αυτά τα αρχικά δεδομένα κατά την εκκίνηση με ένα παράδειγμα παρακάτω.

1. Αρχικοποίηση οντοτήτων JPA εκκίνησης Spring Boot

Για τη φόρτωση αρχικών δεδομένων με το Spring Boot, μπορούμε να χρησιμοποιήσουμε το Spring Boot που είναι ενσωματωμένο για υποστήριξη για JPA. Ας υποθέσουμε ότι έχουμε μια οντότητα υπαλλήλου, η οποία απαιτεί ένα σχήμα και δείγμα δεδομένων για να αρχικοποιηθούν στη βάση δεδομένων.

public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    private String employeeName;
    private String salary;
    private Date createdAt;
    private Date updatedAt;
}

Όταν εκτελούμε την εφαρμογή μας, το Spring Boot θα δημιουργήσει έναν κενό πίνακα για εμάς, αλλά δεν θα τον συμπληρώσει για την παραπάνω καθορισμένη οντότητα. Τα σχήματα για τις οντότητές σας μπορούν να δημιουργηθούν αυτόματα με τη ρύθμιση spring.jpa.hibernate.ddl-auto στο αρχείο διαμόρφωσης Spring Boot σε create ή create-drop. Αν ορίσετε ddl-auto για δημιουργία ή δημιουργία-απόθεση, η Αδρανοποίηση θα δημιουργήσει ένα σχήμα για την οντότητά σας με βάση την αντιστοίχιση του. Πρέπει να προσθέσετε την ακόλουθη ιδιότητα στο δικό σας application.properties αρχείο.

spring.jpa.hibernate.ddl-auto=create

Οταν ο ddl-auto ή create-drop δημιουργούνται τιμές, αναζητά το Hibernate import.sql στη διαδρομή κλάσης προκειμένου να αρχικοποιηθούν δεδομένα. Μπορείτε να προσθέσετε το import.sql αρχείο στο classpath:

INSERT INTO employee VALUES 
	('Steve', '50000', '2022-04-04 11:33:30', NULL);
	('Bill', '55000', '2022-04-05 12:33:30', NULL);
	('Mark', '30000', '2022-04-01 04:31:50', '2022-04-08 09:12:32');
	('Josh', '60000', '2022-04-03 09:22:25', '2022-04-07 12:34:54');

Η παραπάνω προσέγγιση, συμπεριλαμβανομένης της χρήσης οντοτήτων ΚΣΙΕ, έχει τα δικά της μειονεκτήματα. Σε import.sql αρχείο, κάθε γραμμή πρέπει να περιέχει μια ενιαία πρόταση SQL. Για να φτιάξετε το import.sql εργασία, θα πρέπει να έχει μία δήλωση για κάθε γραμμή

1.1 Το αρχείο data.sql.

Όπως υποδηλώνει το όνομα, πρέπει να προσθέσουμε το data.sql αρχείο στο μονοπάτι της τάξης. Το Spring Boot θα σαρώσει τη διαδρομή τάξης και θα επιλέξει το αρχείο κατά τη λειτουργία ενημέρωσης της βάσης δεδομένων. Δείτε πώς μπορεί να μοιάζει το αρχείο:

INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Steve', '50000', '2022-04-04 11:33:30', NULL);

INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Bill', '55000', '2022-04-05 12:33:30', NULL);

INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Mark', '30000', '2022-04-01 04:31:50', '2022-04-08 09:12:32');

INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Josh', '60000', '2022-04-03 09:22:25', '2022-04-07 12:34:54');
Φόρτωση αρχικών δεδομένων με Spring Boot
Φόρτωση αρχικών δεδομένων με Spring Boot

1.2. Το αρχείο schema.sql.

Εάν δεν θέλουμε να χρησιμοποιήσουμε τον προεπιλεγμένο μηχανισμό δημιουργίας σχήματος, μπορούμε να δημιουργήσουμε ένα προσαρμοσμένο αρχείο schema.sql για τη φόρτωση των αρχικών δεδομένων με το Spring Boot. Αυτό το αρχείο θα επιλεγεί από το Spring Boot για δημιουργία σχήματος.

CREATE TABLE employee (
  id INTEGER NOT NULL AUTO_INCREMENT, 
  employee_name varchar(45), 
  salary varchar(45) NOT NULL, 
  created_at datetime NOT NULL, 
  updated_at datetime DEFAULT NULL, 
  PRIMARY KEY (id)
);

Σημειώστε ότι οι αρχικοποιήσεις που βασίζονται σε σενάρια, δηλαδή schema.sql και data.sqlκαι οι αρχικοποιήσεις αδρανοποίησης μαζί προκαλούν ορισμένα ζητήματα.

Για να απενεργοποιήσετε την αυτόματη δημιουργία Hibernate, μπορούμε να προσθέσουμε την ακόλουθη ιδιότητα στο application.properties αρχείο. Αυτή η ιδιότητα θα διασφαλίσει ότι θα χρησιμοποιηθεί η προετοιμασία βάσει σεναρίων Spring Boot schema.sql και data.sql κατευθείαν.

spring.jpa.hibernate.ddl-auto=none

Μπορούμε ακόμα να έχουμε τόσο την αυτόματη δημιουργία σχήματος αδρανοποίησης όσο και τη δημιουργία σχήματος βάσει σεναρίου σε σύζευξη ορίζοντας την ακόλουθη ιδιότητα στο application.proerties.

Διαφημίσεις

spring.jpa.defer-datasource-initialization=true

Ως αποτέλεσμα, μόλις ολοκληρωθεί η δημιουργία σχήματος, schema.sql θα διαβαστεί για τυχόν πρόσθετες αλλαγές σχήματος και data.sql θα εκτελεστεί για να συμπληρωθεί η βάση δεδομένων. Οποιεσδήποτε αλλαγές στο data.sql αρχείο και schema.sql Το αρχείο θα επηρεάσει επίσης την πραγματική βάση δεδομένων και τους πίνακες. Η προεπιλογή εκτελεί προετοιμασία βάσει σεναρίων, αλλά αυτό ισχύει μόνο για ενσωματωμένες βάσεις δεδομένων.

Εάν θέλετε πάντα να αρχικοποιείται η βάση δεδομένων χρησιμοποιώντας τα σενάρια, προσθέστε spring.sql.init.mode=always στο application.properties αρχείο.

2. Φόρτωση δεδομένων από πολλούς προμηθευτές DB

Η εφαρμογή Spring Boot μπορεί να δημιουργήσει DDL σχήματα σεναρίων χρησιμοποιώντας την πηγή δεδομένων JDBC. Το εργοστάσιο σύνδεσης με πηγή δεδομένων δημιουργεί και αρχικοποιεί αυτόματα τα σενάρια DML. Αυτό φορτώνει επίσης την SQL ως μέρος της τυπικής σάρωσης διαδρομής class για αρχεία sql, π.χ. schema.sql και data.sql.

2.1. data.sql

Μπορούμε να ενημερώσουμε τα πεδία δεδομένων χρησιμοποιώντας αυτό το αρχείο:

INSERT INTO employee (employee_name, salary, created_at, updated_at) 
VALUES ('Steve', '50000', '2022-04-04 11:33:30', NULL);

Μπορούμε επίσης να φορτώσουμε το schema.sql αρχείο όπως περιγράφεται στην Ενότητα 1 για τη φόρτωση Αρχικών Δεδομένων με Spring Boot. Μπορούμε επίσης να επεξεργαστούμε το schema-${platform}.sql και data-${platform}.sql (η πλατφόρμα μπορεί να είναι αρχεία oracle, MySQL, PostgreSQL). Αυτό επιτρέπει την εναλλαγή μεταξύ των σεναρίων για τη βάση δεδομένων, εάν απαιτείται. Η προετοιμασία της βάσης δεδομένων γίνεται στην ενσωματωμένη βάση δεδομένων στη μνήμη από προεπιλογή, αν και μπορούμε να ορίσουμε το spring.sql.init λειτουργία σε always αρχικοποίηση της βάσης δεδομένων SQL. Επίσης, ενεργοποιεί τη δυνατότητα γρήγορης αποτυχίας από προεπιλογή για τον αρχικοποιητή βάσης δεδομένων που βασίζεται σε σενάρια, δηλαδή η εφαρμογή δεν μπορεί να ξεκινήσει εάν τα σενάρια δημιουργούν εξαιρέσεις.

Αυτοί οι τύποι αρχικοποίησης πηγών δεδομένων που βασίζονται σε σενάρια πραγματοποιούνται πριν από τη δημιουργία οποιουδήποτε EntityManagerFactory φασόλια. ο schema.sql διαχειρίζεται το DDL και δημιουργεί το σχήμα ενώ το data.sql διαχειρίζεται το DML και συμπληρώνει τη βάση δεδομένων. Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο μετεγκατάστασης DB υψηλού επιπέδου όπως το flyway ή το Liquibase για τη δημιουργία και την προετοιμασία του σχήματος. Αυτά μπορούν να σας βοηθήσουν στη δημιουργία σεναρίων με προσαρμοσμένα ονόματα.

3. Αδρανοποίηση για έλεγχο δημιουργίας βάσης δεδομένων

Μια ιδιότητα ειδική για JPA που παρέχεται από το Hibernate για τον έλεγχο της δημιουργίας βάσης δεδομένων και την εκτέλεση δημιουργίας DDL είναι spring.jpa.hibernate.ddl-auto. Μπορούμε επίσης να χρησιμοποιήσουμε αυτήν την ιδιότητα για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Έχει πολλαπλές αξίες ιδιοκτησίας που είναι create, update, create-drop, validate και <em>none</em>. Καθένα από αυτά έχει διαφορετικές λειτουργίες και ελέγχει τη δημιουργία της βάσης δεδομένων με διαφορετικό τρόπο. Ας δούμε πώς το καθένα από αυτά αλλάζει τα ερωτήματα DDL παρακάτω.

  • Δημιουργία: Η αδρανοποίηση θα αποβάλει όλους τους υπάρχοντες πίνακες και στη συνέχεια θα δημιουργήσει τους νέους πίνακες από την αρχή.
  • ενημέρωση: δημιούργησε αντικείμενα με βάση τις αντιστοιχίσεις που περιλαμβάνουν σχολιασμούς ή XML. Αυτό συγκρίνεται με το υπάρχον σχήμα και στη συνέχεια χρησιμοποιείται για την ενημέρωση του σχήματος ανάλογα με τη διαφορά. Δεν θα διαγράψει τυχόν υπάρχοντες πίνακες ούτε θα αφαιρέσει στήλες, ακόμη και όταν δεν απαιτούνται πλέον. Θα ενημερώσει μόνο το υπάρχον σχήμα, δηλαδή θα αλλάξει τους τύπους δεδομένων και θα προσθέσει τυχόν στήλες όπως απαιτείται.
  • create-drop: Παρόμοια με την τιμή της ιδιότητας δημιουργίας. Θα απορρίψει ολόκληρη τη βάση δεδομένων μόλις ολοκληρώσουμε όλες τις λειτουργίες. Είναι χρήσιμο για τη δοκιμή της μονάδας.
  • επικύρωση: Επικύρωση εάν οι πίνακες και οι στήλες ορίζονται στο .sql υπάρχει αρχείο στη βάση δεδομένων ή όχι. Θα ρίξει μια εξαίρεση διαφορετικά.
  • κανένα: Απενεργοποιήστε οποιονδήποτε τύπο παραγωγής DDL.

Εάν δεν έχει εντοπιστεί διαχειριστής σχήματος, η Spring Boot θα ορίσει εσωτερικά αυτήν την τιμή παραμέτρου σε create-drop, αλλιώς κανένα για κάθε άλλη περίπτωση

4. Διαμόρφωση δημιουργίας σχήματος βάσης δεδομένων

Από προεπιλογή, το Spring Boot DataSource θα αρχικοποιείται αυτόματα με ένα σχήμα. Εάν θέλουμε να αλλάξουμε ή να προσαρμόσουμε αυτήν τη συμπεριφορά για τη φόρτωση των αρχικών δεδομένων με το Spring Boot, μπορούμε να χρησιμοποιήσουμε το spring.sql.init.mode ιδιοκτησία. Αυτή η ιδιότητα έχει τρεις τιμές:

Διαφημίσεις

  • πάντα: Αυτό θα αρχικοποιεί πάντα τη βάση δεδομένων.
  • ενσωματωμένο: Πάντα αρχικοποιείτε εάν χρησιμοποιείται μια ενσωματωμένη βάση δεδομένων. Αυτή η ιδιότητα ορίζεται από προεπιλογή εάν δεν έχει καθοριστεί κάποια άλλη τιμή ιδιότητας.
  • ποτέ: Μην αρχικοποιείτε ποτέ οποιονδήποτε τύπο βάσης δεδομένων.

Χρησιμοποιώντας οποιαδήποτε μη ενσωματωμένη βάση δεδομένων όπως MySQL ή PostgreSQLκαθίσταται απαραίτητο να ορίσουμε αυτήν την ιδιότητα σε πάντα εάν θέλουμε να αρχικοποιήσουμε το σχήμα της

5. Χρησιμοποιώντας το @Sql Annotation

ο @Sql Ο σχολιασμός παρέχει έναν δηλωτικό τρόπο αρχικοποίησης και συμπλήρωσης του δοκιμαστικού μας σχήματος. Για τη δοκιμή ενσωμάτωσης, ας δημιουργήσουμε έναν νέο πίνακα και ας τον φορτώσουμε με αρχικά δεδομένα χρησιμοποιώντας το @Sql annotation.

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootInitialLoadIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestClass() {
        assertEquals(4, employeeRepository.findAll().size());
    }
}

Ας δούμε το διαφορετικό συστατικό του @SQL annotation:

Διαφημίσεις

  1. config – Περιγράφει την τοπική διαμόρφωση για τα σενάρια SQL.
  2. executionPhase – μπορούμε να καθορίσουμε πότε θα εκτελεστούν τα σενάρια BEFORE_TEST_METHOD ή AFTER_TEST_METHOD.
  3. δηλώσεις – Επιτρέπει τη δήλωση εκτέλεσης των ενσωματωμένων εντολών SQL.
  4. scripts – Μπορούμε να δηλώσουμε τις διαδρομές προς τα αρχεία σεναρίων SQL για εκτέλεση.
@Test
@Sql({"/import_senior_employees.sql"})
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

6. Χρησιμοποιώντας το @SqlConfig

Χρησιμοποιώντας την @SqlConfig σχολιασμός για τη φόρτωση των αρχικών δεδομένων με Spring Boot, μπορούμε να διαμορφώσουμε τον τρόπο ανάλυσης και εκτέλεσης των σεναρίων SQL. Μπορούμε να δηλώσουμε διαμορφώσεις επιπέδου κλάσης ως @SqlConfig, όπου χρησιμεύει ως παγκόσμιο σκηνικό για την τάξη. Ή, μπορούμε να το χρησιμοποιήσουμε για να ορίσουμε συγκεκριμένα @Sql σχολιασμοί. Ακολουθεί ένα παράδειγμα όπου καθορίζουμε την κωδικοποίηση των σεναρίων SQL μας, μαζί με τη λειτουργία συναλλαγής στην οποία τα εκτελούμε:

@Test
@Sql(scripts = {
        "/import_senior_employees.sql"
    },
    config = @SqlConfig(encoding = "utf-8", transactionMode = TransactionMode.ISOLATED))
public void testLoadDataV1ForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}
  • blockCommentStartDelimiter–Αυτό αντιπροσωπεύει τον οριοθέτη που χρησιμοποιείται για τον προσδιορισμό της έναρξης των σχολίων μπλοκ σε αρχεία δέσμης ενεργειών SQL
  • blockCommentEndDelimiter–Στα αρχεία δέσμης ενεργειών SQL, αυτό χρησιμοποιείται για την εμφάνιση του τέλους των σχολίων μπλοκ
  • σχόλιοΠρόθεμα–Το πρόθεμα που χρησιμοποιείται για την αναγνώριση σχολίων μιας γραμμής σε σενάρια SQL
  • πηγή δεδομένων– Θα εκτελεί σενάρια XML και δηλώσεις SQL έναντι του javax.sql.DataSource φασόλι.
  • κωδικοποίηση–Αυτό αντιπροσωπεύει την κωδικοποίηση που θα χρησιμοποιήσουν τα αρχεία δέσμης ενεργειών SQL. Από προεπιλογή, είναι το ίδιο με την κωδικοποίηση της πλατφόρμας.
  • errorMode–Αυτή η λειτουργία αντιπροσωπεύει το errorMode που πρόκειται να χρησιμοποιηθεί κάθε φορά που παρουσιάζεται σφάλμα κατά την εκτέλεση των σεναρίων
  • διαχωριστής– Αυτό ορίζει τη συμβολοσειρά που χρησιμοποιείται για το διαχωρισμό διαφορετικών μεμονωμένων εντολών. Το „-“ χρησιμοποιείται από προεπιλογή.
  • διαχειριστής συναλλαγών–Αυτό καθορίζει το όνομα bean του PlatformTransactionManager που χρησιμοποιείται από τις συναλλαγές
  • λειτουργία συναλλαγής– Χρησιμοποιείται κατά την εκτέλεση οποιωνδήποτε σεναρίων στη συναλλαγή.

7. Χρησιμοποιώντας το @Sqlgroup Annotation

Στην Java 8 και νεότερη έκδοση, υποστηρίζονται πολλαπλοί σχολιασμοί. Μπορούμε να χρησιμοποιήσουμε αυτή τη δυνατότητα για @Sql σχολιασμοί για τη φόρτωση των αρχικών δεδομένων με το Spring Boot. Για Java 7 και παρακάτω, υπάρχει ένας σχολιασμός κοντέινερ που ονομάζεται @SqlGroup. Μπορούμε να δηλώσουμε πολλαπλές @Sql σχολιασμοί χρησιμοποιώντας το @SqlGroup σχόλιο.

@SqlGroup({
    @Sql(scripts = "/employees_schema.sql",
        config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)),
    @Sql("/import_employees.sql")
})
public class SpringBootSqlGroupAnnotationIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestCase() {
        assertEquals(4, employeeRepository.findAll().size());
    }
}

Περίληψη

Σε αυτό το άρθρο, είδαμε πώς να χρησιμοποιούμε διαφορετικές μεθόδους για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Μάθαμε πώς να ρυθμίζουμε ένα σχήμα και να το συμπληρώνουμε με δεδομένα χρησιμοποιώντας schema.sql και data.sql αρχεία. Επιπλέον, εξετάσαμε τον τρόπο φόρτωσης δεδομένων δοκιμής για δοκιμές χρησιμοποιώντας @Sql, @SqlConfigκαι @SqlGroup σχολιασμοί. Είναι σημαντικό να σημειωθεί ότι αυτή η προσέγγιση είναι πιο κατάλληλη για βασικά και απλά σενάρια. Οποιοσδήποτε προηγμένος χειρισμός βάσεων δεδομένων θα απαιτούσε πιο προηγμένα και εκλεπτυσμένα εργαλεία όπως το Liquibase και το Flyway. Όπως πάντα, ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα.

Schreibe einen Kommentar