Написах безпристрастен EJB метод, който позволява да се получи обект в режим "само за четене".
Начинът, по който да направите това, е да получите обекта с EntityManager след това да го откачите (използвайки JPA 2.0 EntityManager).
Моят код е следният:
@PersistenceContext
private EntityManager entityManager;
public T getEntity(int entityId, Class<T> specificClass, boolean readOnly) throws Exception{
try{
T entity = (T)entityManager.find(specificClass, entityId);
if (readOnly){
entityManager.detach(entity);
}
return entity;
}catch (Exception e){
logger.error("", e);
throw e;
}
}
Първият субект работи добре, но обаждането към detach
Методът връща следната грешка:
GRAVE: javax.ejb.EJBException
at ...
Caused by: java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.detach(Ljava/lang/Object;)V
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.detach(EntityManagerWrapper.java:973)
at com.mycomp.dal.MyEJB.getEntity(MyEJB.java:37)
Не мога да получа повече информация и не разбирам какъв е проблемът ...
Може ли някой да помогне?
Отговори:
7 за отговор № 1Предполагам, че използвате JPA 2.0 с неправилна версия на Hibernate, която не изпълнява спецификацията JPA 2.0. EntityManagerImpl
няма необходимия метод.
Предлагам модернизиране на хибернация до 3.5, което е изпълнение на JPA 2.0.
1 за отговор № 2
Можете да откачите всички обекти с ясни, но отделянето само на едно цяло не е в JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html
Вероятно сте имали хибернация в пътя на изграждане и друга реализация на сървъра на приложения (EclipseLink? Или старата версия на хибернация) ...
Най- entityManager.detach(...)
е в хибернация, но не и в JPA, така че имате нужда от хибернация impl на вашия сървър на приложения, за да използвате тази функция ...