2012-09-07 44 views
6

Khuôn khổ web của tôi (Phát 1.2.5) tạo địa chỉ EJB3Configuration thành phương thức mà nó sử dụng để tạo một EntityManagerFactory(source). Tôi đang làm việc trên một kịch bản và muốn chạy phương thức generateSchemaUpdateScript() từ Cấu hình để tạo các kịch bản lệnh SQL mà tôi có thể xác minh và chạy trên các triển khai sản xuất. Vấn đề tôi gặp phải là tôi không thể tìm ra cách truy cập đối tượng Configuration đã được sử dụng hoặc cách tạo một đối tượng Configuration sau khi EntityManagerFactory được xây dựng.Làm thế nào để có cấu hình Hibernate sau khi EntityManagerFactory được xây dựng?

+0

Tôi khuyên bạn nên nói chuyện với DBA về bất kỳ công cụ giản đồ nào có sẵn. Họ có thể sao chép lược đồ cho bạn hoặc cung cấp tập lệnh. – MarkOfHall

Trả lời

7

Bạn không thể nhận được các đối tượng cấu hình lại từ entitymanagerfactory vì thực hiện chế độ ngủ đông EntityManagerFactoryImpl không giữ một tham chiếu đến đối tượng cấu hình

Lựa chọn của bạn là

  • bản sao mã từ JPAPlugin trong kịch bản của bạn để tạo ra đối tượng cấu hình của riêng bạn
  • định cấu hình các công cụ ngủ đông để làm việc trên lớp học của bạn. Tôi không bao giờ sử dụng công cụ này bản thân mình nhưng tôi đoán rằng cấu hình đúng, ông có thể tạo ra DDL cho bạn
  • tạo lại kịch bản DDL từ cơ sở dữ liệu của bạn
2

Khi nhà máy quản lý Entity đã được tạo ra bạn đang không được phép có xử lý đối tượng Configuration, một phần vì thiết kế mà Configuration được cho là thể hiện hành vi bất biến mà bạn không thể thay đổi các thuộc tính của nó.

tôi đề cập đến Hibernate 3.6.8 nguồn và lớp EJB3Configuration có phương pháp

public AnnotationConfiguration getHibernateConfiguration() { 
     //TODO make it really read only (maybe through proxying) 
     return cfg; 
    } 

AnnotationConfiguration được khai báo là bị phản đối như tất cả các chức năng của nó được chuyển đến lớp Configuration.

Vì vậy, tôi nghĩ rằng việc sử dụng điều này, bạn có thể xử lý cấu hình của mình khi nó được tạo. Bạn phải rất cẩn thận mặc dù không thay đổi bất cứ điều gì trong cấu hình đó.

này được giải thích trong javadocs here

Sau #buildEntityManagerFactory() đã được gọi là, bạn không còn có thể thay đổi trạng thái cấu hình (không có lớp học thêm, không có thay đổi sở hữu vv)

Có nói rằng, những gì bạn đang cố gắng để đạt được để làm là một cái gì đó là STRICTLY KHÔNG ADVISED đặc biệt là trên cơ sở dữ liệu sản xuất. Xem here

Hibernate có thuộc tính có tên “hibernate.hbm2ddl.auto” để hỗ trợ tạo tự động lược đồ trong trường hợp phát triển tập lệnh. Những gì bạn đang cố gắng đạt được theo chương trình có cùng một hiệu ứng là cung cấp cho nó giá trị cập nhật như dưới đây trong xml kiên trì của bạn. Trong thực tế, dưới phương thức này, phương thức generateSchemaUpdateScript được gọi bởi cấu hình khi bạn có giá trị "hibernate.hbm2ddl".auto" thiết lập để 'cập nhật'

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      .................... 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      ...................... 
     </properties> 
    </persistence-unit> 
</persistence> 

Bạn có thể tham khảo giá trị có thể khác cho thuộc tính này here

Tuy nhiên các tài liệu Hibernate stricltly khuyên không nên sử dụng này để chống lại cơ sở dữ liệu sản xuất.

Cuốn sách dứt khoát về Hibernate "Java persistence with Hibernate" cảnh báo điều này

CẢNH BÁO Chúng tôi đã nhìn thấy Xin chào người dùng bernate đang cố gắng sử dụng SchemaUpdate để cập nhật giản đồ của cơ sở dữ liệu sản xuất một cách tự động. Điều này có thể nhanh chóng kết thúc trong thảm họa và sẽ không được phép bởi DBA của bạn.

và cũng vài hạn chế về quá trình schema update

Một tùy chọn bổ sung cho tài sản cấu hình này, cập nhật, có thể hữu ích trong quá trình phát triển: nó cho phép các công cụ SchemaUpdate built-in, mà có thể làm cho quá trình phát triển lược đồ dễ dàng hơn. Nếu được bật, Hibernate đọc siêu dữ liệu của cơ sở dữ liệu JDBC khi khởi động và tạo các bảng mới và các ràng buộc bằng cách so sánh lược đồ cũ với ánh xạ hiện tại là siêu dữ liệu. Lưu ý rằng chức năng này phụ thuộc vào chất lượng của siêu dữ liệu do trình điều khiển JDBC cung cấp, một khu vực mà nhiều trình điều khiển thiếu. Trong thực tế, tính năng này do đó ít thú vị và hữu ích hơn âm thanh.

UPDATE 1: Nếu bạn không có quyền truy cập vào EJB3Configuration và mục tiêu cuối cùng của bạn là tạo ra các kịch bản giản đồ cập nhật cho các tổ chức JPA chú thích sau đó bạn có thể lập trình tạo ra các EJB3Configuration trong một lớp học chính java sử dụng bền bỉ tệp xml chứa các chi tiết cấu hình của cơ sở dữ liệu của bạn và chạy công cụ xuất giản đồ. Xem ví dụ this cách bạn có thể thực hiện. Vì vậy, theo cách này bạn có thể chạy công cụ này trên các thực thể JPA bên ngoài khung công tác của bạn hoặc thậm chí là vùng chứa.

UPDATE 2

Đoạn mã ví dụ được liệt kê here cho thấy làm thế nào bạn có thể sử dụng cập nhật schema Hibernate khi tạo cơ sở dữ liệu di cư cho các ứng dụng chơi. Có vẻ như đây là những gì bạn muốn!

+1

Vì lý do ngoài tầm kiểm soát của tôi, tôi không có quyền truy cập vào cá thể EJB3Configuration, vì vậy tôi không thể lấy Cấu hình từ đó. Tôi đồng ý với lời khuyên bổ sung của bạn, kế hoạch hiện tại của tôi là chạy generateSchemaUpdateScript() đối với cơ sở dữ liệu phát triển của tôi và kiểm tra bản cập nhật sql và để cho DBA của tôi chạy sau khi xác minh nó. –

+0

Xem các cập nhật của tôi ở trên nếu nó hữu ích! – Shailendra

+0

Tôi đã thêm một liên kết trong phần "CẬP NHẬT 2" trông giống như những gì bạn muốn làm! – Shailendra

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