簡體   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