2010-10-13 30 views
19

Tôi hiện đang làm việc trên một ứng dụng máy tính để bàn bằng cách sử dụng JPA/Hibernate để lưu giữ dữ liệu trong cơ sở dữ liệu H2. Tôi tò mò những lựa chọn của tôi là gì nếu tôi cần thay đổi lược đồ cơ sở dữ liệu trong tương lai vì một số lý do. Có lẽ tôi sẽ phải giới thiệu các thực thể mới, loại bỏ chúng hoặc chỉ thay đổi các loại thuộc tính trong một thực thể.Hỗ trợ JPA/Hibernate để di chuyển?

  • Có hỗ trợ trong JPA/Hibernate để thực hiện việc này không?
  • Tôi có phải viết thủ công giải pháp không?

Trả lời

19

Tôi thường để Hibernate tạo DDL trong khi phát triển và sau đó tạo tập lệnh di chuyển SQL thủ công khi triển khai tới máy chủ thử nghiệm (sau này tôi sử dụng cho UAT và máy chủ trực tiếp).

Thế hệ DDL trong Hibernate không cung cấp hỗ trợ cho việc di chuyển dữ liệu, nếu bạn chỉ làm nhiều như thêm trường không rỗng, việc tạo DDL không thể giúp bạn.

Tôi chưa tìm thấy bất kỳ sự chuyển đổi hữu ích thực sự hữu ích nào để trợ giúp điều này.

Có một số thư viện (xem this SO question để biết ví dụ), nhưng khi bạn đang thực hiện một việc như phân tách thực thể hiện tại thành phân cấp bằng cách sử dụng kế thừa đã nối, bạn luôn quay lại SQL thuần túy.

+0

+1 để có nhiều thông tin :) – willcodejavaforfood

1

Có hai lựa chọn:

  • db-to-ngủ đông - gương DB thay đổi cho các đối tượng của bạn bằng tay. Điều này có nghĩa DB của bạn là "hàng đầu"
  • hibernate-to-db - hoặc sử dụng hibernate.hbm2ddl.auto=update, hoặc tự thay đổi DB sau khi thay đổi tổ chức của bạn - đây mô hình đối tượng của bạn là "hàng đầu"
+0

Loại thay đổi nào có thể hibernate.hbm2ddl = tự động đối phó mà không làm hỏng DB của tôi? :) – willcodejavaforfood

+0

hầu hết mọi thứ. Ngoại trừ các cột thả, tôi đoán, nơi bạn sẽ phải tự mình thả chúng. – Bozho

+1

Do * not * sử dụng 'hbm2ddl = auto' trong cài đặt sản xuất, bạn đang xin lỗi nếu bạn làm. –

7

Có lẽ tôi là sẽ phải giới thiệu các thực thể mới, loại bỏ chúng hoặc chỉ thay đổi các loại thuộc tính trong thực thể.

tôi không có bất kỳ kinh nghiệm với nó nhưng Liquibase cung cấp một số Hibernate Integration và có thể so sánh các ánh xạ của bạn chống lại một cơ sở dữ liệu và tạo ra các bản ghi thay đổi thích hợp:

Việc tích hợp LiquiBase-Hibernate ghi cơ sở dữ liệu thay đổi theo yêu cầu của bản đồ Hibernate hiện tại của bạn thành một tệp nhật ký thay đổi mà sau đó bạn có thể kiểm tra và sửa đổi khi cần trước khi thực thi.

Vẫn đang tìm kiếm một cơ hội để chơi với nó và tìm thấy một số câu trả lời cho câu hỏi chờ trả thì phải:

  • nào nó hoạt động khi sử dụng chú thích?
  • yêu cầu tệp hibernate.cfg.xml (mặc dù đây không phải là trở ngại lớn)?

Cập nhật: Ok, cả hai câu hỏi được bao phủ bởi Nathan Voxland trong this response và câu trả lời là:

  • nó hoạt động khi sử dụng chú thích
  • nó yêu cầu hibernate.cfg.xml (hiện tại)
+0

Thật tuyệt, tôi không thực sự có tệp lập bản đồ ngủ đông, chỉ cần một persistence.xml – willcodejavaforfood

+0

@willcodejavaforfood Yeah, cùng ở đây. Nhưng như tôi đã viết, tôi không chắc chắn nó có thể đối phó với một persistence.xml (tôi đã suy nghĩ về việc tạo ra một hibernate.cfg.xml để chơi với nó nếu cần thiết). Có thể mở một câu hỏi khác và [Nathan Voxland] (http://stackoverflow.com/users/45756/nathan-voxland) (tác giả của Liquibase) sẽ hiển thị :) –

+0

Theo [câu hỏi này] (http: // stackoverflow .com/questions/776787/hibernate-using-jpa-chú thích-thực thể-và-liquibase bạn cần) bạn cần một hibernate.cfg.xml nhưng bạn đúng mà sẽ không phải là một vấn đề lớn – willcodejavaforfood

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