2009-06-29 30 views
6

Tôi hiện đang thử nghiệm bằng OSGi. Tôi đang chạy điều này thông qua Eclipse. Tôi muốn có lớp DAO của tôi như là một phần của giải pháp OSGi, nhưng trở ngại đầu tiên của tôi là lỗi này:Persistence.xml và OSGi (Equinox)

Jun 29, 2009 6:12:37 PM org.hibernate.cfg.annotations.Version <clinit> 
INFO: Hibernate Annotations 3.3.0.GA 
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Version <clinit> 
INFO: Hibernate EntityManager 3.3.0.GA 
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Ejb3Configuration configure 
INFO: Could not find any META-INF/persistence.xml file in the classpath 

Tôi đã thử đặt các tập tin persistence.xml ở rất nhiều nơi khác nhau, không có kết quả. Bất kỳ ý tưởng nào về những gì tôi đang làm sai?

Có cách nào để tải persistence.xml theo cách thủ công không?

Các activator trông như thế này:

package com.activator; 


public class PersistenceActivator implements BundleActivator { 

    @Override 
    public void start(BundleContext arg0) throws Exception { 

     EntityManagerFactory emf = Persistence 
       .createEntityManagerFactory("postgres"); 
     EntityManager em = emf.createEntityManager(); 

     SimpleDaoImpl dao = new SimpleDaoImpl(); 
     dao.setEntityManager(em); 

    } 

    @Override 
    public void stop(BundleContext arg0) throws Exception { 
     // TODO Auto-generated method stub 

    } 

} 

Đây là những gì cấu trúc thư mục của tôi trông giống như:

alt text http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg

Đây là tôi MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Dao Plug-in 
Bundle-SymbolicName: Dao 
Bundle-Version: 1.0.0 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Import-Package: org.osgi.framework;version="1.4.0" 
Bundle-Activator: com.activator.PersistenceActivator 
Export-Package: com.dao.service 
Require-Bundle: HibernateBundle;bundle-version="1.0.0" 

HibernateBundle chứa tất cả các Hibernate và Persistence Chum.

Đây là tôi persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 

<persistence> 

    <!-- Sample persistence using PostgreSQL. See postgres.txt. --> 
    <persistence-unit name="postgres" transaction-type="RESOURCE_LOCAL"> 

     <properties> 


      <property name="hibernate.archive.autodetection" value="class" /> 

      <!-- 
       Comment out if schema exists & you don't want the tables dropped. 
      --> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <!-- drop/create tables @startup, drop tables @shutdown --> 


      <!-- Database Connection Settings --> 
      <property name="hibernate.connection.autocommit">true</property> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      <property name="hibernate.connection.username" value="postgres" /> 
      <property name="hibernate.connection.password" value="postgres" /> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/test" /> 

      <!-- Not sure about these... --> 
      <property name="hibernate.max_fetch_depth">16</property> 
      <property name="hibernate.jdbc.batch_size">1000</property> 
      <property name="hibernate.use_outer_join">true</property> 
      <property name="hibernate.default_batch_fetch_size">500</property> 

      <!-- Hibernate Query Language (HQL) parser. --> 
      <property name="hibernate.query.factory_class"> 
       org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 

      <!-- Echo all executed SQL to stdout --> 
      <property name="hibernate.show_sql">true</property> 
      <property name="hibernate.format_sql">false</property> 

      <!-- Use c3p0 for the JDBC connection pool --> 
      <property name="hibernate.c3p0.min_size">3</property> 
      <property name="hibernate.c3p0.max_size">100</property> 
      <property name="hibernate.c3p0.max_statements">100</property> 

      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" /> 

     </properties> 
    </persistence-unit> 



</persistence> 

Những điều tôi đã cố gắng trong Classpath của Manifest không có may mắn:

Bundle-classpath:., META-INF/persistence.xml

Bundle-classpath:., ../META-INF/persistence.xml

Bundle-classpath:., /META-INF/persistence.xml

Bundle-classpath:., ./META-INF/persistence.xml

Bundle-classpath:. , META-INF

Bundle-classpath:., ../META-INF

Bundle-classpath :.,/META-INF

Bundle-classpath:., ./META-INF

Bundle-classpath:., C: \ Workspaces \ OSGiJPA \ Đạo \ META-INF \ kiên trì .xml

Bundle-ClassPath:., C: \ Workspaces \ OSGiJPA \ Đạo \ META-INF

Trả lời

1

Tôi không sử dụng persistence.xml nhưng hibernate.cfg.xml mà là tương tự:

 
src/main/resource/hibernate/hibernate.cfg.xml 

Trong Activator của tôi Tôi nhận được các tập tin thông qua bó bối cảnh: Dưới đây là một số mã ví dụ làm thế nào tôi làm nó và cũng có thể tham khảo tập tin đó:>

 
private void initHibernate(BundleContext context) { 
     try { 
      final AnnotationConfiguration cfg = new AnnotationConfiguration(); 
      cfg.configure(context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml")); 
      sessionFactory = cfg.buildSessionFactory(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
     } 
    } 

Như bạn có thể nhìn thấy dòng mà được các tập tin cấu hình là:

context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml")

Như bạn có thể thấy hibernate.cfg.xml của tôi KHÔNG nằm trong thư mục META-INF. Chỉ trong thư mục gốc dưới/src/......

Hy vọng điều đó sẽ hữu ích.

Christoph

0

Hãy thử sử dụng Bundle-classpath như thế này trong manifest

Bundle-classpath của bạn:., /location/of/persistence.xml

+1

không may mắn. Tôi đã thử: ** Bundle-classpath:., META-INF/persistence.xml ** ** Bundle-classpath:., ../META-INF/persistence.xml** ** Bundle-ClassPath:., /META-INF/persistence.xml** ** Nhóm-ClassPath:., ./META-INF/persistence.xml** ** Bundle-ClassPath:., META-INF ** ** Bundle-classpath:., ../META-INF** ** Bundle-classpath:.,/META-INF ** ** Bundle-classpath:., ./META- INF ** ** Bundle-ClassPath:., C: \ Workspaces \ OSGiJPA \ Dao \ META-INF \ persis tence.xml ** ** Bundle-ClassPath:., C: \ Workspaces \ OSGiJPA \ Dao \ META-INF ** – systemoutprintln

+0

Không hiển thị đúng, vì vậy tôi đặt nó vào chính bài đăng – systemoutprintln

+0

di chuyển persistence.xml đến gốc của gói jar? Điều đó nên chọn nó lên – bwobbones

0

Thư mục Meta-inf không có trên classpath. Điều này sẽ hoạt động đơn giản bằng cách đặt nó theo số src dirctory của bạn. Nếu bạn muốn nó ở một vị trí riêng biệt, thì bạn sẽ phải chỉ định Bundle-Classpath để bao gồm thư mục đó. Theo mặc định, classpath là '.'.

+0

Tôi chỉ cố gắng di chuyển META-INF vào thư mục src .. Vẫn không hoạt động. Tôi cũng đã cố gắng chỉ rõ ràng persistence.xml trong Bundle-Classpath và nó không hoạt động. – systemoutprintln

+0

@Grasper - Không di chuyển thư mục, di chuyển tệp persistence.xml vào nguồn để khi được biên dịch, nó nằm trên đường dẫn lớp của bạn. – Robin

+0

vì vậy tôi đặt persistence.xml vào src và tôi có '.'trên classpath và nó vẫn không hoạt động. Cảm ơn sự giúp đỡ của bạn :-) – systemoutprintln

5

Sử dụng EclipseLink và quên đi Hibernate và triển khai khác, bởi vì:

  • Bạn sẽ phải chơi với các classloader quá nhiều ... Thread.currentThread(). setContextClassLoader (...)

  • Bạn sẽ bị cám dỗ để đặt thuộc tính class-classpath và thêm phụ thuộc theo cách thủ công thay vì các bó hột.

  • Bạn sẽ nhận được cung cấp dịch vụ không tìm thấy lỗi hoặc bạn có thể không có khả năng tìm persistence.xml

Tất cả những nỗ lực trên có thể không hoạt động sau nhiều nỗ lực.

Tuy nhiên, với EclipseLink nó không có trí tuệ, việc triển khai được thiết kế để hoạt động ra khỏi hộp trong môi trường OSGI và không có bất kỳ sự đau đầu tải lớp nào.

+2

EclipseLink thực sự là sự lựa chọn tốt hơn cho OSGi (bằng cách ... RI của nó cho JPA 2). Theo EL UserGuid bạn nên tải EMFactory với điều này: HashMap properties = new HashMap (); properties.put (PersistenceUnitProperties.CLASSLOADER, this.getClass(). GetClassLoader()); entityManagerFactory = new PersistenceProvider(). CreateEntityManagerFactory (PU_NAME, thuộc tính); – lostiniceland

+0

Ngoại trừ Eclipselink không dính vào một số hợp đồng JPA và có lỗi trong các chức năng cơ bản nhất của nó (ví dụ: lưu, xóa). Tôi chỉ có thể giới thiệu nó nếu điều đó không làm phiền bạn hoặc bạn là một người dùng thử và lỗi. –

1

Bạn cần có thư mục chứa META-INF trên đường dẫn lớp. Mỗi thư mục được tìm kiếm cho META-INF và nếu tìm thấy, thì persistence.xml được tìm kiếm.

Nếu bạn đặt "META-INF" trên đường dẫn lớp, thì bạn cần có META-INF khác trong thư mục đó.

+0

Cảm ơn .. Tôi đã đối mặt với vấn đề tương tự .... Nó đã làm việc cho tôi. –

0

Tôi cũng gặp vấn đề tương tự.

Tôi nghĩ rằng liên kết nhật thực là tùy chọn tốt nhất để sử dụng trong môi trường OSGi. Và không có vấn đề gì bởi vì bạn sẽ làm việc cơ bản với việc thực hiện JPA.Khi bạn cần chuyển sang Hibernate, chỉ cần thay thế cấu hình persintece.xml và một số libs.

+0

Đây là hướng dẫn: http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE –

0

bạn cần phải thiết lập bất động sản (đối với hibernate nó sẽ khác nhau):

javax.persistence.provider = org.apache.openjpa.persistence.PersistenceProviderImpl

cho cuộc gọi:

Persistence. createEntityManagerFactory (entityManagerFactoryName, properties)

để làm cho nó hoạt động.

Và như đã đề cập trước đây, bạn cần gói lớp học. Bạn có thể sử dụng ClassloaderEntityManager từ https://issues.apache.org/jira/browse/OPENJPA-1783 để làm điều đó.

Trân

2
  1. (chỉ là một gợi ý): Tốt hơn nếu bạn sử dụng một bộ nạp lười biếng thay vì làm công việc vào activator. Ví dụ, sử dụng một singleton được gọi vào SimpleDaoImpl contructor.
  2. Di chuyển META-INF/persistent.xml trong thư mục src (src/META-INF/persistent.xml) vì dưới thư mục META-INF phát triển không có trong classpath, nó chỉ hoạt động trong chế độ thời gian chạy.
  3. Nếu bạn đang sử dụng EclipseLink jpa OSGi, MANIFEST.MF của bạn thiếu mục nhập JPA-PersistenceUnits. Thêm

    JPA-PersistenceUnits: postgres

    vào MANIFEST.MF.

  4. Sau đó, trong cấu hình khởi chạy của bạn, hãy đặt mức bắt đầu của org.eclipse.persistence.jpa.osgi (cho ecliselink 2.3.x nếu không org.eclipse.persistence.jpa cho 2.1.x) thành 2 và bắt đầu cấp javax .persistence để 1.

GOOD LUCK, trên thực tế 2.3 có một vấn đề trong triển khai, không xử lý bundleresource: // xxxx URL :(, 2.1.2 hoạt động rất tốt;)

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