2017-02-09 18 views
11

thực sự tôi đang làm việc trên dự án ứng dụng khởi động Spring và tôi nhận thấy đôi khi có thời gian kết nối với Cơ sở dữ liệu của tôi trên máy chủ khác (SQL Server), đặc biệt là khi tôi cố gắng di chuyển một số tập lệnh bằng FlyWay, nhưng nó hoạt động sau nhiều lần thử. Tôi nhận thấy sau đó rằng tôi đã không chỉ định trong thuộc tính của tôi spring.jpa.hibernate.ddl-auto. Sau đó tôi đã làm một số nghiên cứu và thấy rằng nó được recommanded để thêm spring.jpa.hibernate.ddl-auto= create-drop trong phát triển. Và thay đổi nó thành: spring.jpa.hibernate.ddl-auto= none trong sản xuất. Nhưng tôi đã không thực sự hiểu làm thế nào nó thực sự làm việc, và làm thế nào hibernate tạo lược đồ cơ sở dữ liệu, với giá trị tạo ra hoặc sử dụng không có. Bạn có thể giải thích về mặt kỹ thuật nó thực sự hoạt động như thế nào, và các recommandations sử dụng tài sản này trong developpment và production server. Cảm ơn bạnchính xác thuộc tính spring.jpa.hibernate.ddl-auto hoạt động như thế nào trong Spring?

+0

FWIW JPA 2.1 có thuộc tính _standard_ javax.persistence.schema-generation.database.action nên không thực sự thấy cần phải sử dụng các thuộc tính cụ thể của nhà cung cấp JPA để tạo lược đồ. –

Trả lời

22

Để lưu nội dung, thuộc tính spring.jpa.hibernate.ddl-auto là Dữ liệu mùa xuân JPA cụ thể và là cách để chỉ định giá trị cuối cùng sẽ được chuyển đến Hibernate theo thuộc tính nó biết, hibernate.hbm2ddl.auto.

Các giá trị create, create-drop, validateupdate về cơ bản ảnh hưởng đến cách quản lý công cụ lược đồ sẽ thao tác lược đồ cơ sở dữ liệu khi khởi động. Ví dụ, hoạt động update sẽ truy vấn API của trình điều khiển JDBC để nhận siêu dữ liệu của cơ sở dữ liệu và sau đó Hibernate so sánh mô hình đối tượng nó tạo dựa trên việc đọc các lớp chú thích của bạn hoặc ánh xạ XML HBM và sẽ cố gắng điều chỉnh lược đồ trên-the -bay.

Ví dụ: hoạt động update sẽ cố gắng thêm cột, ràng buộc mới, v.v. nhưng sẽ không bao giờ xóa cột hoặc ràng buộc có thể tồn tại trước đó mà không còn là một phần của mô hình đối tượng từ lần chạy trước. Thông thường trong trường hợp thử nghiệm, bạn có thể sử dụng create-drop để tạo lược đồ, trường hợp thử nghiệm của bạn bổ sung một số dữ liệu giả, bạn chạy thử nghiệm và sau đó trong quá trình dọn dẹp, các đối tượng lược đồ sẽ bị loại bỏ, để lại một cơ sở dữ liệu trống.

Khi phát triển, thường thấy các nhà phát triển sử dụng update để tự động sửa đổi lược đồ để thêm các bổ sung mới khi khởi động lại. Nhưng một lần nữa hiểu, điều này không loại bỏ một cột hoặc ràng buộc có thể tồn tại từ các lần thực hiện trước đó không còn cần thiết nữa.

Trong quá trình sản xuất, bạn nên sử dụng none hoặc đơn giản là không chỉ định thuộc tính này. Đó là bởi vì thực tế phổ biến cho các DBA để xem xét các kịch bản di chuyển cho các thay đổi cơ sở dữ liệu, đặc biệt nếu cơ sở dữ liệu của bạn được chia sẻ trên nhiều dịch vụ và ứng dụng.

+1

Vâng, không bao giờ sử dụng thế hệ ddl trong sản xuất. Chúng tôi tạo ra các tập lệnh ban đầu cho cấu trúc bảng bằng ddl và liên quan đến DBA trong quá trình này. Sau đó, chúng tôi bao gồm các kịch bản lệnh db như một phần của đơn vị triển khai và thực thi chúng bằng Flyway khi ứng dụng được triển khai. Khi chúng ta cần sửa đổi cơ sở dữ liệu, chúng ta thêm các kịch bản lệnh mới vào phiên bản tiếp theo của ứng dụng và triển khai để dàn dựng. Đường bay sẽ tự động phát hiện phiên bản hiện tại và chạy tập lệnh cần thiết để đưa cơ sở dữ liệu lên phiên bản mới nhất. Nếu mọi thứ hoạt động, chúng tôi triển khai để sản xuất. –

+0

nếu chúng tôi không chỉ định tài sản này thì sao? ví dụ tôi có của riêng tôi ... cập nhật Tôi đã có điều này và vì lý do nào đó bảng của tôi bị bỏ luôn, cho đến khi tôi thêm thuộc tính được đề cập ở trên ;; ps: xin lỗi mẫu mã) –

+0

Tôi đã khởi động H2 và spring đã quyết định sử dụng" tạo và thả ", và tôi đoán điều này sẽ ghi đè thuộc tính của tôi rằng tôi đã đặt https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html –

Các vấn đề liên quan