estoy usando la herencia con EJB en algunos escenarios, a veces con anotaciones en la superclase como esto entityDAO genérica:El misterio de la herencia de Java EE 6 anotaciones
public class JpaDAO<T>{
protected Class<T> entityClass;
@PersistenceContext(unitName="CarrierPortalPU")
protected EntityManager em;
protected CriteriaBuilder cb;
@PostConstruct
private void init() {
cb = em.getCriteriaBuilder();
}
public JpaDAO(Class<T> 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<T> findAll(){
CriteriaQuery<T> cq = cb.createQuery(entityClass);
Root<T> 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);
}
}
Con un ejemplo subclase implementado como esto:
@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class DepartmentDAO extends JpaDAO<Department> {
public DepartmentDAO() {
super(Department.class);
}
public Department findByName(String name){
CriteriaQuery<Department> cq = cb.createQuery(Department.class);
Root<Department> 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;
}
}
}
Hace poco leí que las anotaciones Java no se heredan (source). Esto debería causar que mi JpaDAO arroje una excepción de puntero nulo al acceder a su administrador de entidades o su generador de criterios (ya que se ignorarían tanto @PersistanceContext como @PostConstruct), sin embargo, este no es el caso. ¿Alguien puede aclarar cómo funciona esto realmente? Estoy un poco preocupado por lo que sucede con mis @TransactionAttributes en la superclase, ¿puedo confiar en un REQUERIDO para usar realmente las transacciones cuando se me llama desde la subclase, cuando la subclase NO tiene NOT_SUPPORTED como clase predeterminada?