2016-05-16 6 views
0

Ich möchte eine Remote-EJB für eine Entitätsklasse erstellen. Gibt es eine Möglichkeit, eine Methode mit einem Parameter zu implementieren, die einem Objekt einer Klasse zugeordnet ist, die speziell die Annotation @Entity enthält? Der Zweck ist, nur eine Bean für alle meine Entitäten zu erstellen.Java - Objektparameter in Methode muss @Entity-Annotation haben

Beispiel:

public void save(Entity ent){ 
    em.persist(ent); 
} 

Antwort

1

Wenn Sie nur 1 ejb für alle Unternehmen haben, werden Sie bald auf Probleme stoßen, wenn Sie einige von ihnen in besonderer Weise zu behandeln haben.

Aber Sie können dies mit einem abstrakten Super-EJB tun, und immer noch 1 Ejb pro Einheit, aber es ist sehr einfach zu erstellen. Und Sie können weiterhin die vererbten Standardmethoden überschreiben. Generieren Sie JSF-Seiten aus Entitätsklassen in Netbeans: just do

@Stateless 
public class TestEjb extends AbstractEjb<TestEntity> { 

    @PersistenceContext(unitName = "...") 
    private EntityManager em; 

    public TestEjb() { 
     super(TestEntity.class); 
    } 

    public EntityManager getEntityManager() { 
     return em; 
    } 
} 

Quelle

public abstract class AbstractEjb<T> { 
    private Class<T> entityClass; 

    public AbstractEjb(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(T entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0] + 1); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 

} 

für ein Unternehmen zu implementieren.