我构建了一个Spring-Boot应用程序,用于访问数据库并从中提取数据。一切都运行正常,但我想从外部.properties文件配置表名。
像:
labelEncoder.classes_
我试图找到一些东西,但我没有。
您可以使用@Entity
@Table(name = "${fleet.table.name}")
public class Fleet {
...
}
注释访问外部属性。
所以我的问题是:我有什么方法可以配置表名吗?或者我可以更改/拦截由hibernate发送的查询吗?
解决方案:
好的,hibernate 5适用于@Value("...")
。所以我创建了自己的PhysicalNamingStrategy
。
PhysicalNamingStrategy
此外,这个Stackoverflow article over NamingStrategy给了我这个想法。
答案 0 :(得分:1)
表名实际上来自于hibernate本身的战略接口。 Boot将其配置为SpringNamingStrategy
,并且Boot 2.x中有一些更改可以自定义。值得阅读gh-1525进行这些更改的内容。 Configure Hibernate Naming Strategy有更多信息。
有一些想法可以添加一些自定义属性来配置SpringNamingStrategy
,但我们允许更容易地自定义整个策略bean,因为它允许用户做他们需要做的任何事情。
AFAIK,没有像你要求的那样直接进行配置,但我认为如果你创建自己的策略,你可以自动将自己的属性连接到那里。在那些自定义策略接口中,您将看到实体名称,您可以在引导程序的配置属性中为此保留一个键空间并匹配实体名称。
mytables.naming.fleet.name=foobar
mytables.naming.othertable.name=xxx
您的配置属性将mytables
,naming
内的Map
将是<?xml version="1.0" encoding="utf-8"?> <manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gebruiker.scribetest">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="???"/>
<data android:mimeType="???"/>
<category android:name="???"/>
</intent-filter>
</activity>
</application>
</manifest>
。然后在您的自定义策略中,只需通过从映射表中检查是否定义了自定义名称。
答案 1 :(得分:0)
Spring Boot解决方案: 创建以下课程
@Configuration
public class CustomPhysicalNamingStrategy extends SpringPhysicalNamingStrategy{
@Value("${table.name}")
private String tableName;
@Override
public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return Identifier.toIdentifier(tableName);
}
}
将以下属性添加到application.properties:
spring.jpa.properties.hibernate.physical_naming_strategy=<package.name>.CustomPhysicalNamingStrategy
table.name=product