2012-02-28 33 views
6

Tôi đã học chơi bằng cách làm theo hướng dẫn trên trang web của họ để xây dựng một công cụ viết blog nhỏ.Làm cách nào để quản lý diễn biến cơ sở dữ liệu khi tôi đang sử dụng JPA?

Nó sử dụng JPA và trong đó gọi là Bootstrap Fixtures.Deletemodels(), (hoặc một cái gì đó tương tự).

Về cơ bản, nó nukes tất cả các bảng mỗi khi nó chạy và tôi mất tất cả dữ liệu.

Tôi đã triển khai một hệ thống sản xuất như (sans the nuke statement).

Bây giờ tôi cần triển khai bản cập nhật lớn cho hệ thống sản xuất. Nhiều lớp đã thay đổi, được thêm vào và đã bị xóa. Trong thử nghiệm của tôi tại địa phương, mà không nuking các bảng trên mỗi chạy tôi chạy vào vấn đề đồng bộ. Khi tôi cố gắng viết hoặc đọc từ bảng chơi sẽ ném lỗi. Tôi đã mở mysql và chắc chắn rằng các bảng chỉ được sửa đổi một phần và sửa đổi không chính xác trong một số trường hợp. Ngay cả khi tôi có chế độ DDL được đặt thành "tạo" trong JPA cấu hình của tôi thì dường như không "tìm ra" cách điều chỉnh các thay đổi và sửa đổi lược đồ của tôi cho phù hợp.

Vì vậy, tôi phải đặt lại trong câu lệnh bootstrap để loại bỏ tất cả các bảng của tôi.

Vì vậy, tôi bắt đầu xem xét các diễn biến cơ sở dữ liệu trong Play và đọc một bài viết trên trang web của khung chơi về các diễn biến cơ sở dữ liệu. Bài báo đã nói về các kịch bản phiên bản, nhưng nó nói, "Nếu bạn làm việc với JPA, Hibernate có thể xử lý các diễn biến cơ sở dữ liệu cho bạn một cách tự động. Các diễn biến rất hữu ích nếu bạn không sử dụng JPA".

Vì vậy, nếu JPA có nghĩa vụ phải chăm sóc điều này cho tôi, làm cách nào để triển khai các bản cập nhật lớn cho ứng dụng Play lớn? Cho đến nay JPA đã không thể làm cho các lược đồ thay đổi một cách chính xác và ứng dụng sẽ ném lỗi. Tôi không quan tâm đến việc mất tất cả dữ liệu của tôi để sửa chữa trên dev "Fixtures.deleteModels()" có thể không thực sự được sử dụng trong sản.

Cảm ơn trước, Josh

Trả lời

7

Không, JPA không nên xử lý nó cho bạn. Nó không phải là một công cụ ma thuật. Nếu bạn quyết định đổi tên "khách hàng" thành "khách hàng", cột "đường phố" thành "dòng1" và chuyển giá trị của cột loại khách hàng từ 1, 2, 3 thành "đồng", "bạc", " vàng ", không có cách nào cho JPA đọc trong tâm trí của bạn và con số tất cả những thay đổi để làm automagically. Để di chuyển từ lược đồ này sang lược đồ khác, bạn sử dụng các công cụ tương tự như khi bạn không sử dụng JPA: tập lệnh SQL hoặc nhiều công cụ di chuyển dữ liệu và lược đồ quảng cáo hoặc thậm chí mã JDBC di chuyển tùy chỉnh.

+0

Ok, vì vậy tài liệu phát chỉ đơn giản là sai. Đây là một letdown như tôi thực sự phụ thuộc vào tính năng này. –

+0

Vậy tôi có thể bật kịch bản tiến hóa trong khi vẫn sử dụng JPA không? Các tài liệu chơi làm cho nó có vẻ như hai là loại trừ lẫn nhau. –

+0

Bạn có ý nghĩa gì khi "bật tập lệnh tiến hóa"? –

0

Có một tài sản được gọi hbm2ddl.auto=update mà sẽ cập nhật sơ đồ của bạn. Tôi chắc chắn sẽ không sử dụng cài đặt này trong sản xuất vì nó giới thiệu một cấp độ hoàn toàn mới về các vấn đề nếu có sự cố. Nó hoàn toàn tốt cho sự phát triển mặc dù.

+0

Vì vậy, làm thế nào để tôi nhận được schema sản xuất của tôi tất cả điều chỉnh? Trang web chơi cho biết JPA sẽ chăm sóc nó cho tôi. Điều này có đúng không? –

+0

Phát triển phần mềm và quản trị hệ thống là hai vùng đất riêng biệt với các quy tắc, mối quan tâm và hình phạt riêng của họ. Nếu bạn sẵn sàng làm mọi thứ trong sản xuất theo cách bạn sử dụng để phát triển, bạn đang yêu cầu các vấn đề và mất tiền! Vấn đề là: có! bạn có thể có diễn biến mà cuối cùng sẽ được sử dụng trong sản xuất nhưng không chạy bất cứ điều gì trừ khi bạn có một DBA có kinh nghiệm giám sát công việc và quan tâm về những gì cần phải được thực hiện trong trường hợp mọi thứ đi rất xấu! –

4

Hãy xem flyway. Bạn có thể kích hoạt di chuyển cơ sở dữ liệu từ mã của bạn hoặc maven.

0

Khi thùng chứa JPA bắt đầu (nói, EclipseLink hoặc bất kỳ loại nào khác), nó dự kiến ​​sẽ tìm một cơ sở dữ liệu khớp với các lớp @Entity bạn đã xác định trong mã của bạn. Nếu cơ sở dữ liệu đã được di chuyển, mọi thứ sẽ hoạt động trơn tru; nếu không: có thể nó sẽ thất bại.

Vì vậy, câu chuyện dài ngắn, bạn cần phải thực hiện di chuyển cơ sở dữ liệu (hoặc diễn biến, nếu bạn thích) trước khi bắt đầu vùng chứa JPA. Rõ ràng, Play thực hiện di chuyển cho bạn, trước khi Play khởi động trình quản lý cơ sở dữ liệu bạn đã định cấu hình.Vì vậy, về mặt lý thuyết, bất kể ORM bạn đang sử dụng, Play quyết định khi nào là thời gian cho ORM bắt đầu công việc của mình. Vì vậy, khái niệm nó nên hoạt động.

Đối với một bài thuyết trình tốt về chủ đề này, xin vui lòng có một cái nhìn tại các video thứ hai tại địa chỉ: http://flywaydb.org/documentation/videos.html

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