【问题标题】:JPA/Hibernate switch schema programmaticallyJPA/Hibernate 以编程方式切换模式
【发布时间】:2011-10-05 15:12:44
【问题描述】:

我目前正在开发一个具有以下要求的新项目:

多个数据库架构保存具有相同结构的相同表(简而言之:一个实体用于多个架构)。

是否可以通过代码在这些模式之间切换?我想要实现的是:

用户选择模式 B 并更新其中的一些实体。在此之后,他在模式 A 中进行插入,依此类推。我知道我可以通过为语句提供架构来通过基本 JDBC 来做到这一点,但如果我可以避免这样做,我会这样做。

也许其他一些 java ORM 可以做到这一点?我只熟悉 JPA / Hibernate。

问候

【问题讨论】:

    标签: java database hibernate orm jpa


    【解决方案1】:

    您可以使用单独的SessionFactorys 或EntityManagerFactorys,每个架构一个。 既然你说用户选择架构A或B,你可以使用这样的:

    public enum Schema {
        A, B
    }
    
    public EntityDaoImpl {
    
        // Create and populate the map at DAO creation time (Spring etc.).
        private Map<Schema, SessionFactory> sessionFactoryBySchema = ...; 
    
        private Session getSession(Schema schema) {
            SessionFactory sessionFactory = sessionFactoryBySchema.get(schema);
            return sessionFactory.getCurrentSession(); // ... or whatever
        }
    
        public void saveEntity(Schema schema, Entity entity) {
            getSession(schema).save(entity);
        }
    }
    

    【讨论】:

    • 该解决方案在运行时不需要任何进一步的配置。抱歉在我的问题中没有提到这一点
    • 进一步配置指的是什么?
    • 可以随时将具有此类实体的其他模式导入数据库。我需要动态工作的东西。通过元数据获取对应的schema并进行访问
    • 我不认为你可以在不添加一些 SessionFactory 的情况下使用 Hibernate 来做到这一点,因为 Hibernate 在配置时需要模式(确切地说是创建 SessionFactory)。如果在应用程序运行时将创建新模式,您可以“懒惰地”获取所选模式所需的 SessionFactory - 如果它尚不存在,您将以编程方式创建它 - new Configuration().buildSessionFactory() 并添加将其映射到类似于我在答案中发布的地图。
    • 在这种情况下是否可能存在类加载器问题?我想知道 Hibernate 是否会为每个模式创建具有相同确切名称的类,并且可能会让它们感到困惑。
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2012-02-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多