Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展JPA实体映射_Java_Hibernate_Jpa_Jakarta Ee_Ejb 3.0 - Fatal编程技术网

Java 扩展JPA实体映射

Java 扩展JPA实体映射,java,hibernate,jpa,jakarta-ee,ejb-3.0,Java,Hibernate,Jpa,Jakarta Ee,Ejb 3.0,我正在寻找一种扩展现有JPA映射的简单方法。其思路如下: 我有一个带有EJB3+JPA模块的EAR项目,该项目对ClassA进行了注释并映射到表class_a。但是我希望其他一些模块(另一个EJB模块)有ClassB,它为ClassA(extend?)添加了更多属性 我想到的一种方法是将这些附加字段添加到class_a表中,然后运行非HQL查询来检索该数据。这并不好,因为我必须手工做很多事情:类型映射、列映射等等 我做了简单的检查,但似乎无法在第二个模块中扩展ClassA(通过ClassB),因

我正在寻找一种扩展现有JPA映射的简单方法。其思路如下:

我有一个带有EJB3+JPA模块的EAR项目,该项目对ClassA进行了注释并映射到表class_a。但是我希望其他一些模块(另一个EJB模块)有ClassB,它为ClassA(extend?)添加了更多属性

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

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

我已经在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
    。/path\u to\u first\u jar\u file.jar

    @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(需要一个将实现
    EntitiyManager和ExtendedEntitiesInterface
    interface的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)
        }
    }