题
我正在寻找一种简单的方法来扩展现有的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模块:
-
罐子是基础的。它包含扩展的基本实体和本地接口:
@Entity public class BaseEntity { public long id; @Id @GeneratedValue public long getId() {... ... other variables, getters, setters ... } @Local public interface EntitiyManagerWithExtendedEntitiesInterface { public EntityManager getEntityManager; }
-
第一个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; } }
-
第二个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模块以包含另一组扩展实体。