Тайна наследования аннотаций Java EE 6

Я использую наследование с 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 как класс по умолчанию?

10
задан Rasmus Franke 4 April 2011 в 09:17
поделиться