Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 弹簧靴&x2B;JPA&x2B;休眠不同的表名前缀_Java_Spring_Hibernate_Spring Boot_Jpa - Fatal编程技术网

Java 弹簧靴&x2B;JPA&x2B;休眠不同的表名前缀

Java 弹簧靴&x2B;JPA&x2B;休眠不同的表名前缀,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我正在开发一个多租户应用程序(使用旧的数据库结构),其中我有一个公共用户表和一组基于访问权限的表 例如,如果用户可以处理不同公司C1和C2的发票,则数据库包含一个名为C1_invoice和C2_invoice的表 我能够通过使用org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl实现向一家公司添加前缀 因此,我可以访问C1\u发票表。但如何动态选择前缀C1或C2?您可以使用的变体 它基本上是在Spring数据中使用h

我正在开发一个多租户应用程序(使用旧的数据库结构),其中我有一个公共用户表和一组基于访问权限的表

例如,如果用户可以处理不同公司C1和C2的发票,则数据库包含一个名为C1_invoice和C2_invoice的表

我能够通过使用org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl实现向一家公司添加前缀


因此,我可以访问C1\u发票表。但如何动态选择前缀C1或C2?

您可以使用的变体

它基本上是在Spring数据中使用hibernate的多租户功能,提供一个自定义的
多租户连接提供程序
。连接提供程序从数据源映射中读取连接详细信息。您可以为每个数据源中的
hibernate.physical\u naming\u策略提供不同的值。不过,我不确定是否有办法将每个数据源的前缀指定为属性。您可以为每个租户创建一个单独的
PhysicalNamingStrategy
子类。可能会很可怕

你用的是什么数据库?或者,您可以通过为每个租户提供一个模式,并使用不固定的名称将其表从默认模式中别名来解决此问题,具体做法如下:

CREATE SYNONYM C1.INVOICE FOR DEFAULT.C1_INVOICE;

这样,您就可以使用Hibernate的标准
MultitenancyStrategy.SCHEMA
策略

我认为,如果您将公司ID用作每个发票记录的外键,则会更简单。这样,应用程序将在未来扩展,而不会添加越来越多的表,比如C3和C4。不过这是一个有趣的问题。@RajaAnbazhagan,我相信“旧数据库结构”意味着一个无法更改的旧模式。我没有注意到这一点。请原谅。@RajaAnbazhaganYes这是旧模式。现在不能更改。您好,我尝试过用这种方式实现。但是,在这种方法中,我需要提前指定数据源。但我的问题不同。我需要根据访问哪个公司来决定访问哪个表。有没有一种方法可以在存储库中执行查询注入?