JPA/Hibernate如何在程序中切换模式?

6
我目前正在处理一个新项目,它有以下要求:
多个数据库模式具有相同的表结构(简而言之:一个实体对应多个模式)。
是否可以通过代码在这些模式之间切换?我想要实现的是:
用户选择B模式并更新其中的一些实体。完成后,在A模式中进行插入操作等。我知道可以通过基本的JDBC提供模式语句来实现此操作,但如果可以避免这样做,我会这么做。
也许其他的Java ORM可以做到这一点?我只熟悉JPA / Hibernate。
谢谢。
1个回答

2
您可以为每个模式使用单独的SessionFactoryEntityManagerFactory。 由于您说用户会选择模式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);
    }
}

解决方案在运行时不应需要任何进一步的配置。抱歉,在我的问题中没有提到这一点。 - onigunn
其他具有此类实体的模式可以随时导入到数据库中。我需要一些可以动态工作的东西。通过元数据获取相应的模式并访问它们。 - onigunn
1
我认为在没有添加一些SessionFactory的情况下,你无法使用Hibernate实现这个功能,因为Hibernate需要在配置时就获取架构(确切地说是SessionFactory创建)。如果在应用程序运行时将创建新的架构,则可以“懒惰地”获取所选架构所需的SessionFactory-如果它尚不存在,则可以通过编程方式创建它- new Configuration().buildSessionFactory()并将其添加到与我在答案中发布的类似的映射中。 - Nicolae Albu
我不这么认为,我不知道Hibernate是否会“丰富”类或类似的操作。 - Nicolae Albu
我接受这个问题,因为这是这种情况下唯一干净的解决方案。我通过使用纯JDBC和Spring JDBC模板来解决了我的问题。 - onigunn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接