각각 3 개의 사용자 정의 번들 (api, impl, web)을 포함하는 3 개의 Karaf 기능이 있습니다. 각 기능의 'impl'번들에는 해당 기능에서 사용되는 항목도 포함됩니다. 우리는 이러한 기능을 Karaf 3.0.1에 배포하고 Karaf 3.0.1과 함께 제공되는 OpenJPA 2.3.0을 지속성 공급자로 사용합니다.OSGI (Karaf)에서 OpenJPA를 사용하여 동적 런타임 향상 기능을 지원하지 않는 엔티티
우리는 세 가지 기능의 엔티티에 대해 동적 런타임 향상 기능을 사용합니다. 두 가지 기능의 경우 엔티티는 배포시 항상 향상되며 제대로 작동합니다. 문제는 세 번째 기능에 대한, Karaf와는 OpenJPA 가끔 다음과 같은 예외의 결과로 엔티티의 하위 집합을 향상시키기 위해 놓칠 수 있다는 것입니다 :
<openjpa-2.3.0-r422266:1540826 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
<list-of-missed-unenhanced-classes>"
at org.apache.openjpa.enhance.ManagedClassSubclasser.prepareUnenhancedClasses(ManagedClassSubclasser.java:115)
at org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:312)
at org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:236)
at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:212)
at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:155)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59)
...
우리는 openjpa.RuntimeUnenhancedClasses
옵션을 인식하지만 이후를 사용하려면 않을 것 알려진 제한 사항이 있으며 OpenJPA 2.0.0에서 기본적으로 비활성화되었습니다.
우리는 컴파일 타임 개선에 대해 알고 있으며 성공적으로 사용하고 있지만 런타임 향상 기능을 활성화하려고하는 이유가 있습니다.
우리는 현재 EntityManagerFactory 생성 시간에 OpenJPA가 Karaf에서 사용할 ClassTransformer 인 PersistenceUnitInfo 콜백을 통해 Aries JPA에 등록된다는 것을 알고 있습니다. 이 ClassTransformer는 실제로 첫 번째 두 기능의 모든 항목에 사용되지만 세 번째 기능에 대한 항목의 하위 집합에만 사용됩니다.
우리는 ClassTransformer가 등록 된 시간과 각 엔티티 클래스가로드 된 시간을 기록하려고했습니다. 두 번 성공한 번들과 실패한 번들 간의 차이점을 확인했습니다. 후속 번들의 경우 Aries JPA는 ClassTransformer 등록 직전에 각 엔티티 클래스를로드하려고 시도하지만 실패한 모듈에는 그러한 시도가 없습니다.
를 참조하십시오 내가 생각 런타임 향상을하는 것은 나쁜 디자인합니다. 개발 단계에서는 괜찮지 만 생산에는 적합하지 않을 수도 있습니다. openjpa maven plugin을 사용하여 컴파일 타임을 향상시켜야합니다. –
@AchimNierbeck 우리는 OpenJPA를 사용하는 환경과 Hibernate를 사용하는 환경 둘 다에서 앞서 언급 한 기능을 배치해야한다는 요구 사항이 있습니다. 이것이 OpenJPA로 런타임 향상을 시도한 이유입니다. 이 경우에는 각 환경에 별도의 번들을 제공하는 것이 가장 좋습니다. – gsapountzis
유일한 다른 방법은 향상된 클래스를 DAO 클래스가 포함 된 호스트 번들을 확장하는 조각 번들에 추가하는 것입니다. 이렇게하면 Hibernate와 OpenJPA 환경을위한 두 개의 서로 다른 조각 번들을 가질 수 있습니다. –