Я использую наследование с EJB в нескольких сценариях, иногда с аннотациями в суперклассе, например, в этом универсальном entityDAO:
public class JpaDAO{
protected Class entityClass;
@PersistenceContext(unitName="CarrierPortalPU")
protected EntityManager em;
protected CriteriaBuilder cb;
@PostConstruct
private void init() {
cb = em.getCriteriaBuilder();
}
public JpaDAO(Class type) {
entityClass = type;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void create(T entity) {
em.persist(entity);
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public T find(Object id) {
return em.find(entityClass, id);
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public List findAll(){
CriteriaQuery cq = cb.createQuery(entityClass);
Root entity = cq.from(entityClass);
cq.select(entity);
return em.createQuery(cq).getResultList();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void remove(T entity) {
em.remove(em.merge(entity));
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public T edit(T entity) {
return em.merge(entity);
}
}
В примере подкласса, реализованном следующим образом:
@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class DepartmentDAO extends JpaDAO {
public DepartmentDAO() {
super(Department.class);
}
public Department findByName(String name){
CriteriaQuery cq = cb.createQuery(Department.class);
Root department = cq.from(Department.class);
cq.where(cb.equal(department.get(Department_.name), name));
cq.select(department);
try{
return em.createQuery(cq).getSingleResult();
}catch(Exception e){
return null;
}
}
}
Недавно я прочитал, что аннотации Java НЕ наследуются (источник) . Это должно привести к тому, что мой JpaDAO выбрасывает исключение нулевого указателя при доступе к своему entitymanager или его построителю критериев (поскольку и @PersistanceContext, и @PostConstruct будут проигнорированы), однако это не так. Может кто-нибудь прояснить, как это на самом деле работает? Меня немного беспокоит, что происходит с моими @TransactionAttributes в суперклассе, могу ли я доверять REQUIRED для фактического использования транзакций при вызове из подкласса, когда подкласс имеет NOT_SUPPORTED как класс по умолчанию?