2013-07-03 24 views
6

Bu, şu anda sahip olduğum bir mimari sorun. EJB ve JPA'yı bir projeye entegre etmenin en iyi uygulamaları konusunda yardıma ihtiyacım var. Uygulamamın iş mantığını içeren hizmet katmanının işini yapacak olan EJB'lere sahip olmak istiyorum. Tam tersine, bu iki tabakayı mümkün olduğu kadar ayırmak için bir DAO fabrikası kullanarak EJB'lerin bir tutamağa sahip olacak bir DAO katmanına sahip olmak istiyorum. Bunu bildiğim için, DAO'yu EJB olarak da yapamıyorum, çünkü onların otomatik olarak enjekte edilmelerini istemiyorum, çünkü bunların fabrikada yaratılmasını istiyorum. o, EBA ile ayrılmış DAO ve Hizmet Katmanları ile JPA

public abstract class JPADataAccessorObject<K, E> implements DataAccessorObject<K, E> { 
    protected Class<E> entityClass; 

    protected EntityManager entityManager; 

    protected JPADataAccessorObject(Class<E> pEntityClass) { 
     this.entityManager = Persistence.createEntityManagerFactory("PortalEJB").createEntityManager(); 
     this.entityClass = pEntityClass; 
    } 

    /* Other DAO functions (update, delete, create) */ 
} 

bu kötü olduğunu düşünüyorum değildir: Yani bu çağrı benim soyut JPA DAO'sunda bulunduğu ... beni elle Şimdi
Persistence.createEntityManagerFactory("PortalEJB").createEntityManager(); 

kullanarak EntityManager oluşturmak yol açar? Bu sınıfın tüm somut uzantıları kalıcılık bağlamının yepyeni bir kopyasına sahip olacak ve garip davranışlar elde edeceğim. Ayrıca, bunu yaptığımda, düşünmek Ben işlemleri kendim de hizmet katmanında yönetmek zorundayım.
  • herhangi bir hizmet katmanın fonksiyonu sonra işlem yapar (herhangi bir istisna oluşursa İşlem geri)

    • herhangi bir hizmet katmanın fonksiyonu önce işlem Oluştur/prosedürü: Ben böyle bir şey bunun için Yönleri oluşturmak üzere olduğu/prosedür

    Yani benim sorular şunlardır:

    • nasıl I Manag gerektiğini EntityManager?
    • Bir kopyayı çoklu iş parçacığından koruyacak şekilde yönetecek bir çeşit JPA hizmet sınıfım olmalı mı?
    • Korkunç bir hata yapıyorum, lütfen en iyi uygulamaları sağlayın.
  • +0

    Java EE'in hangi sürümü? –

    +0

    GlassFish 3.1 üzerinde EJB 3.1, Java 1.6, JPA 2.0 (EclipseLink) kullanıyorum –

    cevap

    5

    Adam Bien JPA/EJB3 KILLED THE DAO ve DAOS AREN'T DEAD - BUT THEY EITHER COLLAPSED OR DISAPPEARED yazısını gördünüz mü?

    public abstract class AbstractFacade<E extends Serializable, 
                PK extends Serializable> { 
    
        private final transient Class<E> entityClass; 
    
        public AbstractFacade(final Class<E> entityClass) { 
         this.entityClass = entityClass; 
        } 
    
        protected abstract EntityManager getEntityManager(); 
    
        public void create(final E entity) { 
         final EntityManager entityManager = getEntityManager(); 
         entityManager.persist(entity); 
        } 
    
        public final E find(final PK id) { 
         return getEntityManager().find(entityClass, id); 
        } 
    
        // Other common operations 
    
    } 
    

    Ve belirli hizmet:

    @Stateless 
    public class UserFacade extends AbstractFacade<User, String> { 
    
        @PersistenceContext(unitName = "MyPU") 
        private EntityManager em; 
    
        @Override 
        protected EntityManager getEntityManager() { 
         return em; 
        } 
    
        public UserFacade() { 
         super(User.class); 
        } 
    
        // Other methods of this service 
    
    } 
    

    San Francisco JavaOne 2012'den itibaren Java EE 6/7: The Lean Parts daha bakın

    başka bir elinde

    , hizmetin katman için soyut bir sınıf düşünebiliriz .

    +0

    Örneğinizde, hizmet katmanınız JPA'ya bağlıdır, ki bence, kötü bir şey. Kullanıcıların, bir FTP sunucusunda onları "bırakacak" eski bir ana bilgisayardan geldiğini varsayalım. DAO fabrikasıyla, UserDAO'nun kapsamı olan bir FTPUserDAO ve JPAUserDAO olabilir. Önerdiğiniz gibi, FTP için tamamen yeni bir servis katmanı setine sahip olmanız gerekir. Şimdi, kullanıcılarınız üzerinde gerçekten karmaşık bir iş algoritmanız varsa ne olacak? –

    +1

    Sorun yok. Eski sisteminiz için belirli bir fabrika oluşturabilir ve CDI ile enjekte edebilirsiniz. –

    +0

    Buna katılıyorum. DAO ve Servisleri ayırmak, benim düşünceme göre, daha güvenli bir yoldur.Son bağlantınız olsa da, videonun başında, adam JSF JPA Eğitimi'ni arar ve tam olarak ihtiyacım olan şey hakkında iyi bir öğretici var! http://wiki.eclipse.org/EclipseLink/Examples/JPA/JSF_Tutorial –

    İlgili konular