Ошибка гибернации Karaf 4.0.5

у меня есть этот класс

import org.hibernate.Session;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.List;

public class BaseJpaDao<E> implements BaseDao<E>{
    protected Class<?> entityClass;

    private EntityManager entityManager;

    public BaseJpaDao(Class<?> entityClass, EntityManager entityManager) {
        this.entityClass = entityClass;
        this.entityManager = entityManager;
    }

    @Override
    public E persist(E e) {
        entityManager.persist(e);
        return e;
    }

    @Override
    public E get(Long id) {
        return (E) entityManager.find(entityClass, id);
    }

    @Override
    public E get(Integer id) {
        return (E) entityManager.find(entityClass, id);
    }

    @Override
    public List<E> getAll() {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<E> cq = cb.createQuery((Class<E>) entityClass);
        Root<E> rootEntry = cq.from((Class<E>) entityClass);
        CriteriaQuery<E> all = cq.select(rootEntry);
        TypedQuery<E> allQuery = entityManager.createQuery(all);
        return allQuery.getResultList();
//        return entityManager.createCriteria(entityClass).list();
//        return new ArrayList<>();
    }

    @Override
    public E merge(E e) {
        return entityManager.merge(e);
    }

    @Override
    public void remove(E e) {
        entityManager.remove(e);
    }

    @Override
    public void remove(Long id) {
        E e = get(id);
        entityManager.remove(e);
    }

    @Override
    public void saveAll(List<E> entityList) {
        for (E entity : entityList) {
            entityManager.merge(entity);
        }

        entityManager.flush();
    }

    @Override
    public EntityManager getEntityManager() {
        return entityManager;
    }

    @Override
    public Session getSession() {
        Session unwrap = null;
        unwrap = entityManager.unwrap(Session.class);
        return unwrap;
    }

}

И когда я начинаю свой караф, он начинается хорошо. но после перезагрузки у меня ошибка

karaf@root>ERROR: Bundle domain.payment.module.impl [254] Error starting mvn:domain/payment-module-impl/1.0.0 (org.osgi.framework.BundleException: Uses constraint violation. Unable to re
solve resource domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)] because it is exposed to package 'javax.persistence' from resources org.apache.geronimo.specs.geroni
mo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [106](R 106.0)] and javax.persistence [javax.persistence [31](R 31.0)] via two dependency chains.

Chain 1:
  domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)]
    import: (&(osgi.wiring.package=javax.persistence)(version>=1.1.0)(!(version>=2.0.0)))
     |
    export: osgi.wiring.package: javax.persistence
  org.apache.geronimo.specs.geronimo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [106](R 106.0)]

Chain 2:
  domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)]
    import: (&(osgi.wiring.package=org.hibernate)(version>=4.2.0)(!(version>=5.0.0)))
     |
    export: osgi.wiring.package=org.hibernate; uses:=javax.persistence
  org.hibernate.core [org.hibernate.core [204](R 204.0)]
    import: (osgi.wiring.package=javax.persistence)
     |
    export: osgi.wiring.package: javax.persistence
  javax.persistence [javax.persistence [31](R 31.0)] Unresolved requirements: [[domain.payment.module.impl [254](R 254.0)] osgi.wiring.package; (&(osgi.wiring.package=org.hibernate)(version>=4.
2.0)(!(version>=5.0.0)))])
org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve resource domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)] because it is exposed to
package 'javax.persistence' from resources org.apache.geronimo.specs.geronimo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [106](R 106.0)] and javax.persistence [javax.persistence [31
](R 31.0)] via two dependency chains.

Chain 1:
  domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)]
    import: (&(osgi.wiring.package=javax.persistence)(version>=1.1.0)(!(version>=2.0.0)))
     |
    export: osgi.wiring.package: javax.persistence
  org.apache.geronimo.specs.geronimo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [106](R 106.0)]

Chain 2:
  domain.payment.module.impl [domain.payment.module.impl [254](R 254.0)]
    import: (&(osgi.wiring.package=org.hibernate)(version>=4.2.0)(!(version>=5.0.0)))
     |
    export: osgi.wiring.package=org.hibernate; uses:=javax.persistence
  org.hibernate.core [org.hibernate.core [204](R 204.0)]
    import: (osgi.wiring.package=javax.persistence)
     |
    export: osgi.wiring.package: javax.persistence
  javax.persistence [javax.persistence [31](R 31.0)] Unresolved requirements: [[domain.payment.module.impl [254](R 254.0)] osgi.wiring.package; (&(osgi.wiring.package=org.hibernate)(version>=4.
2.0)(!(version>=5.0.0)))]
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
        at java.lang.Thread.run(Thread.java:745)

Но если я удалю этот метод и весь импорт в классах, где он используется

@Override
        public Session getSession() {
            Session unwrap = null;
            unwrap = entityManager.unwrap(Session.class);
            return unwrap;
        }

спящий импорт работает нормально. karaf 4.0.5 в karaf 3.0.6 все работало нормально.


person user5620472    schedule 29.04.2016    source источник


Ответы (1)


Проблема с ограничением использования заключается в том, что у вас установлены два разных пакета спецификаций jpa.

Я предполагаю, что один из ваших собственных функций, а другой - из функций karaf. Вы должны либо ссылаться на тот же пакет, что и karaf, либо предпочтительно пометить пакет как dependency="true". Это позволяет karaf решить, нужно ли это.

person Christian Schneider    schedule 30.04.2016