2009-05-03 243 views
0

我正在尋找一種簡單的方法來擴展現有的JPA映射。這個想法如下:擴展JPA實體映射

我有一個EJB3 + JPA模塊的EAR項目,它具有ClassA註釋並映射到表class_a。但是我希望其他模塊(另一個EJB模塊)具有ClassB,它將更多屬性添加到ClassA(擴展?)。

我的一個方法就是將這些附加字段添加到class_a表並運行非HQL查詢來檢索該數據。這是不好的,因爲我必須手工做很多事情:類型映射,列映射等。

我已經做了簡單的檢查,但似乎我無法在第二個模塊(按ClassB)擴展ClassA,因爲他們使用不同的EntityManagerFactories,第一個模塊中的一些類不會被第二個模塊看到,反之亦然。

我已經在persistence.xml中看到了< jar文件>標籤。我需要類似的東西,但是它的使用需要將該文件列在第一個模塊中,並且它必須存在(如果找不到,它不會跳過)。有沒有這樣的東西,可以放在擴展模塊(第二個)上,而不是可擴展模塊(第一個)?

如果有一種方法可以在運行時擴展JPA映射,那就太好了。有沒有這樣的方式?我的問題還有其他解決方案嗎?

回答

0

實施的解決方案如下。 我有一個罐和兩個EJB模塊:

  1. 罐子是基礎之一。它擁有基本的實體和本地接口用於擴展:

    @Entity 
    public class BaseEntity { 
        public long id; 
        @Id @GeneratedValue 
        public long getId() {... 
        ... other variables, getters, setters ... 
    } 
    
    @Local 
    public interface EntitiyManagerWithExtendedEntitiesInterface { 
        public EntityManager getEntityManager; 
    } 
    
  2. 第一個EJB模塊是一個將擴展基本實體,並添加EJB來獲得它的實體管理器。該模塊還包含persistence.xml<jar-file>../path_to_first_jar_file.jar</jar-file>行。

    @Entity 
    ... discriminator annotations 
    public class ExtEntity extends BaseEntity { 
        ... additional fields here 
    } 
    
    @Stateless 
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface { 
        @PersitenceContext 
        EntityManager em; 
        public EntityManager getEntityManager() { 
         return em; 
        } 
    } 
    
  3. 第二EJB模塊將僅需要罐子編譯,但需要先EJB運行(需要將實現EntitiyManagerWithExtendedEntitiesInterface接口的EJB)的EJB。

    @Stateless 
    public class getSomeEntity { 
        @EJB 
        EntitiyManagerWithExtendedEntitiesInterface ext; 
        EntityManager em; 
        @PostConstruct 
        public void injectEntityManager() { 
         em = ext.getEntityManager(); 
        } 
        public void ejbInterfaceMethod() { 
         ... method that uses em variable (EntityManager) 
        } 
    } 
    

這種方式,應用程序服務器將不得不管理模塊之間的依賴關係,我可以很容易地交換第1 EJB模塊包括另一組擴展實體。