繁体   English   中英

扩展JPA实体映射

[英]Extending JPA entity mapping

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

我有一个带EJB3 + JPA模块的EAR项目,该项目具有注解的ClassA并映射到表class_a。 但是我希望其他一些模块(另一个EJB模块)具有ClassB,从而为ClassA添加更多属性(扩展?)。

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

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

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

如果有一种方法可以在运行时扩展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以获得其实体管理器的模块。 此模块还包括带有<jar-file>../path_to_first_jar_file.jar</jar-file>行的persistence.xml

     @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) } } 

这样,应用程序服务器将必须管理模块之间的依赖性,并且我可以轻松地交换第一个EJB模块以包括另一组扩展实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM