我正在寻找一种简单的方法来扩展现有的JPA映射。这个想法如下:

我有一个带有EJB3 + JPA模块的EAR项目,该模块具有ClassA注释并映射到表class_a。但我想要一些其他模块(另一个EJB模块)使用ClassB,它会为ClassA添加更多属性(扩展?)。

我的一个方法是将这些附加字段添加到class_a表并运行非HQL查询以检索该数据。这不好,因为我必须手工做很多事情:类型映射,列映射等。

我已经完成了简单的检查,但似乎我无法在第二个模块中扩展ClassA(通过ClassB),因为它们使用不同的EntityManagerFactories,第二个模块中的某些类不会被第二个模块看到,反之亦然。 / p>

我已经看过<!> lt; jar-file <!> gt; persistence.xml中的标记。我需要这样的东西,但是使用它需要在第一个模块中列出该文件并且它必须存在(如果没有找到它将不会跳过)。是否有类似的东西,可以放在扩展模块(第二个)而不是可扩展模块(第一个)?

如果有一种方法可以在运行时扩展JPA映射,那就太棒了。有这样的方式吗?我的问题还有另一个解决方案吗?

有帮助吗?

解决方案

实施的解决方案如下。 我有一个jar和两个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 with <jar-file>../path_to_first_jar_file.jar</jar-file> line。

    @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模块将拥有只需要jar来编译但需要运行第一个EJB的EJB(需要一个将实现EntitiyManagerWithExtendedEntitiesInterface接口的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)
        }
    }
    
  4. 这样,应用程序服务器必须管理模块之间的依赖关系,我可以轻松地交换第一个EJB模块以包含另一组扩展实体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top