当前位置: 首页 > 面试题库 >

如何使用Hibernate处理几个数据库模式?

贾俊喆
2023-03-14
问题内容

在我的一个项目中,我有一个管理多个客户(或客户,如果您愿意的话)的应用程序。对于他们每个人,我在数据库上都有一个专用的架构。但是,应用程序一次只处理一个客户端,即,用户必须从应用程序中的一个客户端切换到另一个客户端(在运行时,不重新启动应用程序),以便从该新客户端访问数据。

您将如何管理此类项目的连接以及持久层?

我想为此使用hibernate。在处理几个数据库/模式时,我必须特别注意哪些方面?

在这种情况下,Spring可以提供任何帮助吗?

如果我不够清楚,请举一个例子来说明情况。想象一下,我的应用程序可以处理两个客户端:clientONEclientTWO。我已经实现了一个类,该类可以为我提供给定客户端的数据库架构,用户,密码和连接字符串。

每个客户端有债务人的名单,但遗憾的是,债务人表结构是不一样的clientONEclientTWO。甚至表/列的名称也不一样…

因此,我可以为每个客户端创建一个债务人类(我使用Hibernate注释):

@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor {

    @Id
    @Column(name = "ID_DEBTOR")
    private String idDebtor;

    ...

}

和:

@Entity
@Table(name = "T_DEBTOR_TWO") // Table names are not the same among the different schemas...
...
public class ClientTwoDebtor {

    @Id
    @Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
    private String idDebtor;

    ...

}

理想情况下,我将尝试使用一个通用Debtor类(这是一个Abstract类,但是我可以使用Interface):

public abstract class AbstractDebtor {

    public abstract String getIdDebtor();

    ...

}


@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor extends AbstractDebtor {

    @Id
    @Column(name = "ID_DEBTOR")
    private String idDebtor;

    ...

}


@Entity
@Table(name = "T_DEBTOR_TWO")
...
public class ClientTwoDebtor extends AbstractDebtor {

    @Id
    @Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
    private String idDebtor;

    ...

}

这样,对我来说,在DAO
/服务层中操作Debtor对象将变得更加容易,因为我不需要为每个客户端重复我的DAO和服务。例如,DAO中获取所有债务人列表的方法将为public List<AbstractDebtor> getAllDebtors() { ... }

因此,当我更改由应用程序管理的客户端时,如何更改上下文?换句话说,我如何向Hibernate(或Spring?)指示要使用与当前由我的应用程序管理的客户端有关的正确的持久性对象(ClientOneDebtorClientTwoDebtor)?

如果您认为我走错了方向,请不要犹豫,就如何解决此类问题分享您的想法…

编辑有关第一个答案的信息:

我将需要处理的不同模式的数量大约为15-20。除此之外,我只需要映射它们表的一小部分。

我也知道,每个客户/客户只有一个架构并不是存储数据的最佳解决方案。但是,这种体系结构已有5年的历史了,我们可能会在下一年(仅在最佳情况下;))使用一种模式。


问题答案:

如果一次只需要一个,那么它将变得更加简单。只需创建一个SessionFactory每个数据库。避免使用HibernateUtils静态SessionFactory实例方法,这样就不会有任何问题。

如果您没有太多的数据库(数百个),使用Spring的一种巧妙方法是ApplicationContext为每个数据库实例化一个单独的Spring
,其中包含专门用于该数据库的SessionFactoryBeanDataSource配置。

您可以使用Spring机制(例如PropertyOverrideConfigurer和共同的父母)ApplicationContext来排除所有共同的东西,以使您的许多孩子ApplicationContext小而可维护。

然后,当有请求进入时,只需选择ApplicationContext您要使用的对象,然后开始将其拉出即可。

如果要在没有Spring的情况下执行此操作,则还可以创建多个SessionFactory实例并将“当前”实例存储在static中ThreadLocal



 类似资料:
  • 问题内容: 由于数据库表中的值为空,我得到“ org.hibernate.PropertyAccessException” 。如何处理异常? 我的档案是 FetchTest.java FetchTest.java Employee.java hibernate.cfg.xml employee.hbm.xml When I ran this application I am getting bel

  • 问题内容: 我们有一个使用maven配置的Java应用程序,该应用程序使用多个数据库。这是一个应用程序-许多架构。 我已经配置了flyway,已经过测试,并且效果很好,但是我的配置仅适用于一个数据库。 这是我的pom.xml使用一种模式进行测试: 更新:通过使用现在提供的答案,我将以下pom.xml配置为2个模式。 我执行飞行操作,但没有成功,这是我收到的错误: 数据库配置正常。另外,我检查了架构

  • 我们有一个用maven配置的java应用程序,它使用多个数据库。它是一个应用程序——许多模式。 我已经配置了flyway,经过测试,效果很好,但我的配置只针对一个数据库。 这是我的pom。用一种模式测试xml: 更新:通过使用现在提供的答案,我有以下pom。xml配置了两种模式。 我执行了flyway操作,但没有成功,下面是我得到的错误: 数据库配置正常。我还检查了模式是否正常。我缺少什么? 更新

  • 问题内容: 我有很多关于在Android应用程序中处理异步数据库的问题。 由于我知道数据库是异步的,因此我尝试了几种方法来处理它。如您在代码中所见,我有两个函数需要在数据库中使用数组。我的第一个函数()将对数据库中的数组应用更改,而我的第二个函数()需要将此数组与从我的第一个函数中应用的更改一起使用。这是我的代码: 这是setArray_for_database的代码: 这是我的把戏。具有另一个内

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 我们设置了开发环境,以便Hibernate每次启动我们的应用程序时都会创建一个新的空数据库: 这适用于部署在服务器上的单个应用程序,但在我们的开发环境中,我们通常部署连接到同一数据库的多个应用程序。它们都使用来自应用程序服务器的相同数据源。 问题在于,当它们在 JBoss AS7 中启动时,它们是并行部署的,因此两个应用程序服务器都尝试同时创建表。我们得到这样的东西(带有匿名的表格和列名): 这些