2012-06-17 31 views
16

Tôi đã cố gắng chạy đường bay trong ứng dụng của mình trước khi hibernate được gắn vào JBoss AS 7.1 của tôi. Tôi đã thử với chú thích @javax.ejb.Startup, nhưng điều này được thực thi SAU Hibernate được khởi tạo và lược đồ cơ sở dữ liệu được chọn.Mở rộng CDI cho Đường bay

Vì vậy, theo như tôi hiểu chúng tôi có thể sử dụng một phần mở rộng CDI mà móc trước khi Hibernate được khởi tạo. Có một số hỗ trợ cho rằng ra khỏi hộp cho đường bay? Và nếu không, có ai đã từng làm điều này trước đây không?

+0

Tôi không nghĩ rằng có một sự kiện tiêu chuẩn J2EE mà xảy ra đủ sớm cho việc này. Bạn sẽ phải móc vào các giao diện vùng chứa cụ thể. Tôi không biết có ai làm điều đó cho Flyway hay không, xin lỗi. Bạn đã cân nhắc thực hiện nó như là một phần của quá trình triển khai hoặc bắt đầu tập lệnh thay vì khởi động ứng dụng? –

+0

@TomAnderson Tôi đã cân nhắc thực hiện hành động trên đường bay trong tập lệnh triển khai của mình, tôi phải sử dụng Công cụ Đường dẫn Dòng lệnh cho điều đó. Nó không phải là rõ ràng từ các tài liệu hướng dẫn nếu nó hỗ trợ Java di cư, quá, vì vậy tôi đoán tôi chỉ cần cố gắng đó;) Tôi chắc chắn có một cách để đạt được điều này khi khởi động ứng dụng, bởi vì nó có thể với Liquibase (xem https://github.com/aaronwalker/liquibase/commit/5be42a6779b2bef95e2d02d8703aceec91aedb59). Tôi đã thử một cái gì đó tương tự, nhưng tiếc là nó không hoạt động trên máy của tôi .... –

+1

@DominikObermaier Có, Flyway Command Line không hỗ trợ di chuyển Java. Chúng có thể được vận chuyển dưới dạng tệp jar bên trong thư mục/jars. –

Trả lời

28

Ok cuối cùng tôi đã tìm ra cách thực hiện điều này: Tôi đã phải sử dụng API tích hợp Hibernate. Đây là toàn bộ mã tôi đã phải viết:

public class FlywayIntegrator implements Integrator { 

    @Override 
    public void integrate(final Configuration configuration, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { 
    final Flyway flyway = new Flyway(); 

    flyway.setDataSource(....); 
    flyway.migrate(); 
    } 

    @Override 
    public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { 
    //no-op 
    } 

    @Override 
    public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { 
    //no-op 
    } 
} 

Nếu bất cứ ai quan tâm đến việc biết thêm chi tiết, tôi đã tạo ra một dự án github đó chứng tỏ rằng: https://github.com/dobermai/Hibernate-Flyway-Integration

+1

Cảm ơn bạn đã đăng giải pháp của bạn Dominik. Tôi đọc qua cuộc trò chuyện của bạn với Scott trong kênh IRC jboss và nó dẫn tôi đến đây - thật tuyệt khi bạn đã tạo ra một dự án githib để chứng minh nó. – user1180316

+3

Cảm ơn rất nhiều. Điều này thực sự đã giúp tôi. Để có được một nguồn dữ liệu từ JBoss trong bối cảnh Integrator, hãy sử dụng nó: DataSource dataSource = InitialContext.doLookup ("java: jboss/datasources/your-ds"); – homaxto

+0

Sẽ rất tuyệt vời nếu có thể thực hiện điều này ngay từ 'configuration',' sessionFactoryImplementor' hoặc 'sessionFactoryServiceRegistry'. Tôi đã poked xung quanh và không thể tìm thấy nguồn dữ liệu hoặc tên JNDI của nó. : ( – danieljimenez

1

CDI định nghĩa vòng đời của chính nó được thực hiện khi một ứng dụng khởi động/dừng. (Bạn không nên biết về nó: This là một nơi tốt để tìm hiểu về cơ chế cơ bản.)

Vấn đề - với kiến ​​thức tốt nhất của tôi là quá trình khởi tạo Hibernate không được liên kết trực tiếp với khởi động CDI. Điều này có nghĩa rằng tôi không chắc chắn nếu nó an toàn để dựa vào một mối quan hệ giữa Hibernate & CDI "sự kiện". Chắc chắn không có gì giống như CDI-Sự kiện HibernateInitialized.

Có nói điều này, tôi sẽ thử: Bạn nên triển khai một tiện ích mở rộng đơn giản treo tại số BeforeBeanDiscovery, sớm nhất là khi được.

This online presentation cung cấp tổng quan về các sự kiện CDI khác nhau và thứ tự của chúng. Đó là tiếng Đức, thật không may.

+1

Cảm ơn, tôi đã tìm ra, Sự kiện BeforeBeanDiscovery được ném sau khi Hibernate được khởi tạo. Vì vậy, tôi đoán nó là không thể móc trong trước khi Hibernate được khởi tạo (ít nhất là không với CDI, có lẽ có cái gì đó cụ thể AS?). –

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