2009-05-03 297 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模块包括另一组扩展实体。